Welcome

首页 / 软件开发 / .NET编程技术 / 趣味编程:将事件视为对象(参考答案)

趣味编程:将事件视为对象(参考答案)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;
}
}