趣味编程:将事件视为对象(参考答案)2011-05-13 博客园 赵劼这次我们是要编写一个DelegateEvent<TDelegate>对象,提供它AddHandler和RemoveHandler的实现。事实上,在之前还有一篇文章中,我们搞了一个人模狗样的构造方式,但是它往往不适合用于实际使用过程中。因此,其实DelegateEvent<TDelegate>最关键的地方还是各种不同的“构造方式”,使它可以用于各种情况。方法一:直接提供添加删除的实现在之前的文章里,已经有一些朋友提出了最简单的做法,即直接提供AddHandler和RemoveHandler的实现,例如:public class DelegateEvent<TDelegate>
{
private Action<TDelegate> m_addHandler;
private Action<TDelegate> m_removeHandler;
public DelegateEvent(Action<TDelegate> add, Action<TDelegate> remove)
{
this.CheckDelegateType();
if (add == null) throw new ArgumentNullException("add");
if (remove == null) throw new ArgumentNullException("remove");
this.m_addHandler = add;
this.m_removeHandler = remove;
}
private void CheckDelegateType()
{
if (!typeof(Delegate).IsAssignableFrom(typeof(TDelegate)))
{
throw new ArgumentException("TDelegate must be an Delegate type.");
}
}
public DelegateEvent<TDelegate> AddHandler(TDelegate handler)
{
this.m_addHandler(handler);
return this;
}
public DelegateEvent<TDelegate> RemoveHandler(TDelegate handler)
{
this.RemoveHandler(handler);
return this;
}
}