繁体   English   中英

检查是否已附加特定的事件处理程序方法

[英]Check if a specific event handler method already attached

与此问题相关, 检查事件是否已存在

但不同的是我只想知道事件是否附加了特定的方法。 所以可能附加了其他方法,但我只想知道是否存在特定的方法。

我的环境是 dotnet 4.0 中的 C#。

例如

Event += MyMethod1;
Event += MyMethod2;

// Some code
if (MyMethod1IsAttachedToEvent())
{
    // Achieved goal
}

这可能吗?

你不能。

event关键字是明确发明的,以防止您做自己想做的事情。 它使事件的委托对象无法访问,因此没有人可以弄乱事件处理程序。

来源: 如何确定已订阅事件

foreach ( Delegate existingHandler in this.EventHandler.GetInvocationList() )
{
    if ( existingHandler == prospectiveHandler )
    {
          return true;
    }
}

使用GetInvocationList方法遍历委托。

Event.GetInvocationList().Any(x => x.Method.Name.Equals("yourmethodname"));

迟到的答案在这里。 我相信 Parimal Raj 的答案是正确的,因为我找不到直接访问事件的方法。 但是,我创建了两种方法来解决这个问题:

  1. 添加前删除。 如果该方法不存在,我在尝试删除不存在的方法时不会收到错误消息。 这样您就可以确保调用列表只调用 method1 一次。

     Event -= MyMethod1; Event += MyMethod1;
  2. 您要向其添加事件的对象可能具有 .Tag 属性。 您可以使用标签来存储有关您已添加的方法的信息。 这里我只有一种方法,所以我只需要检查Tag是否为空。 但是可以通过这种方式处理更复杂的场景:

     if(control.Tag == null) { //ony added once, when tag is null control.TextChanged += new EventHandler(validate); control.Tag = new ControlTag(); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM