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