2

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

    public event EventHandler DataCommited;

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

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

4

1 回答 1

2

可以实现一个将 DataCommited 事件作为参数的方法。

嗯,不是真的。你可以拿一个EventInfo,但仅此而已。重要的是要理解这个声明:

public event EventHandler DataCommited;

实际上创造了件事:

  • 一个事件,其他类中的代码可以订阅和取消订阅
  • 一个类型的字段EventHandler,您可以使用它来调用处理程序,或单独获取每个处理程序。

您当前代码的一个更简单的实现就是这样:

public event EventHandler DataCommited;

private void DetatchListeners()
{
    DataCommitted = null;
}

毕竟,取消订阅类似字段的事件只会更改字段的值。

但是,如果您有EventInfo,您不知道该事件是如何实现的。它可能由一个字段直接支持 - 它可能不是......没有一般的方法可以为当前的处理程序询问事件,或设置新的处理程序列表。您可以直接对事件执行的所有操作就是订阅和取消订阅。

如果只使用类似字段的事件,则可以使用反射来查找字段的名称并将值设置为 null。但一般情况下你不能这样做。

有关更多信息,请参阅我关于代表和事件的文章。

于 2012-10-08T16:34:02.027 回答