我有一个C#类,它引入了一个新的自定义事件类型,并允许用户向其添加或删除侦听器。此外,我还实现了一个方法,在调度期间撤销所有事件侦听器;
public event EventHandler DataCommited;
private void DetatchListeners()
{
if (DataCommited != null)
{
foreach (EventHandler eh in DataCommited.GetInvocationList())
{
DataCommited -= eh;
}
}
}
可以实现一个将DataCommited事件作为参数的方法。因此,我可以使用一种方法取消对一组事件的签名。我尝试了很多方法来实现它,但不幸的是没能实现。我想知道它是否真的可能,以及如何实现。非常感谢。
可以实现一个将DataCommited事件作为参数的方法。
嗯,不是真的。你可以考EventInfo
,但仅此而已。重要的是要理解以下声明:
public event EventHandler DataCommited;
实际上创建了两个东西:
- 其他类中的代码可以订阅和取消订阅的事件
- 类型为
EventHandler
的字段,您可以使用它来调用处理程序,或者单独获取每个处理程序
当前代码的一个更简单的实现就是:
public event EventHandler DataCommited;
private void DetatchListeners()
{
DataCommitted = null;
}
毕竟,取消订阅类似字段的事件只会更改字段的值。
但是,如果您有一个EventInfo
,您不知道该事件是如何实现的。它可能直接由字段支持-可能不是……没有通用的方法来询问事件的当前处理程序,或设置新的处理程序列表您可以直接对事件执行的所有操作是订阅和取消订阅。
如果只使用类似字段的事件,则可以使用反射来查找字段的名称并将值设置为null。不过一般情况下你做不到。
有关更多信息,请参阅我关于代表和活动的文章。