gpt4 book ai didi

c# - 取消签署所有事件监听器,C# 代码示例

转载 作者:太空宇宙 更新时间:2023-11-03 11:15:33 24 4
gpt4 key购买 nike

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

    public event EventHandler DataCommited;

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

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

最佳答案

It is possible to implement a method which will be taking DataCommited event as an argument.

嗯,不是真的。您可以使用 EventInfo,但仅此而已。理解这个声明很重要:

public event EventHandler DataCommited;

实际上创建了两个东西:

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

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

public event EventHandler DataCommited;

private void DetatchListeners()
{
DataCommitted = null;
}

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

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

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

查看我的 article on delegates and events获取更多信息。

关于c# - 取消签署所有事件监听器,C# 代码示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12785684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com