我有一个C#类,它引入了一个新的自定义事件类型,并允许用户添加或删除它的侦听器。我还实现了一个在调度期间恢复所有事件监听器的方法;
public event EventHandler DataCommited;
private void DetatchListeners()
{
if (DataCommited != null)
{
foreach (EventHandler eh in DataCommited.GetInvocationList())
{
DataCommited -= eh;
}
}
}
可以实现一个将DataCommited事件作为参数的方法。所以,我可以使用一种方法取消一组事件。我尝试了很多方法来实现它,但遗憾的是没有做到。我想知道它是否真的可能以及如何实现。谢谢!!!
答案 0 :(得分:2)
可以实现一个将DataCommited事件作为参数的方法。
嗯,不是真的。您可以选择EventInfo
,但仅此而已。理解这句话很重要:
public event EventHandler DataCommited;
实际上创建了两个的东西:
EventHandler
类型的字段,您可以使用该字段调用处理程序,或单独获取每个字段。您当前代码的简单实现就是:
public event EventHandler DataCommited;
private void DetatchListeners()
{
DataCommitted = null;
}
取消订阅类似字段的事件只会改变字段的值。
但是,如果您有EventInfo
,则不知道该事件是如何实现的。 可能直接由字段支持 - 它可能不是......没有通用的方式向事件请求其当前处理程序,或设置新的处理程序列表。 所有你可以直接对事件进行订阅和取消订阅。
如果您只使用类似字段的事件,则可以使用反射来查找字段的名称并将值设置为null。但你不能一般地做到这一点。
有关详细信息,请参阅我的article on delegates and events。