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

时间:2012-10-08 16:29:55

标签: c# event-handling

我有一个C#类,它引入了一个新的自定义事件类型,并允许用户添加或删除它的侦听器。我还实现了一个在调度期间恢复所有事件监听器的方法;

    public event EventHandler DataCommited;

    private void DetatchListeners()
    {
        if (DataCommited != null)
        {
            foreach (EventHandler eh in DataCommited.GetInvocationList())
            {
                DataCommited -= eh;
            }
        }
    }

可以实现一个将DataCommited事件作为参数的方法。所以,我可以使用一种方法取消一组事件。我尝试了很多方法来实现它,但遗憾的是没有做到。我想知道它是否真的可能以及如何实现。谢谢!!!

1 个答案:

答案 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