取消对所有事件侦听器的签名,C#代码示例

取消对所有事件侦听器的签名,C#代码示例,c#,event-handling,C#,Event Handling,我有一个C#类,它引入了一种新的自定义事件类型,并允许用户向其中添加或删除侦听器。我还实现了一个方法,该方法在分派期间撤销所有事件侦听器 public event EventHandler DataCommited; private void DetatchListeners() { if (DataCommited != null) { foreach (EventHandler eh in DataCommit

我有一个C#类,它引入了一种新的自定义事件类型,并允许用户向其中添加或删除侦听器。我还实现了一个方法,该方法在分派期间撤销所有事件侦听器

    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。但一般来说你不能这么做


有关更多信息,请参阅我的。

将帮助您感谢您的回复。这很有帮助。我将继续复习这篇文章。