15

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

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

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

例如

Event += MyMethod1;
Event += MyMethod2;

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

这可能吗?

4

4 回答 4

22

你不能。

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

来源 :如果一个事件已经被订阅,如何进行 demine

于 2013-03-06T03:59:41.180 回答
4
foreach ( Delegate existingHandler in this.EventHandler.GetInvocationList() )
{
    if ( existingHandler == prospectiveHandler )
    {
          return true;
    }
}

GetInvocationList使用该方法遍历委托。

于 2013-03-06T04:00:24.383 回答
3
Event.GetInvocationList().Any(x => x.Method.Name.Equals("yourmethodname"));
于 2013-03-06T03:59:22.057 回答
2

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

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

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

    if(control.Tag == null)
    {
         //ony added once, when tag is null
         control.TextChanged += new EventHandler(validate); 
         control.Tag = new ControlTag();
    }
    
于 2020-09-05T21:24:39.013 回答