【问题标题】:Check if a specific event handler method already attached检查是否已附加特定的事件处理程序方法
【发布时间】:2013-02-20 17:36:23
【问题描述】:

关于这个问题, Check if an event already exists

但不同之处在于我只想知道某个特定方法是否附加到事件中。所以可能有 other 附加方法,但我只想知道是否存在特定的方法。

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

例如

Event += MyMethod1;
Event += MyMethod2;

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

这可能吗?

【问题讨论】:

标签: c# .net events c#-4.0 event-handling


【解决方案1】:
Event.GetInvocationList().Any(x => x.Method.Name.Equals("yourmethodname"));

【讨论】:

    【解决方案2】:

    没有。你不能。

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

    来源:How to dermine if an event is already subscribed

    【讨论】:

    • 谢谢,这是我的印象。想知道是否有办法解决它。
    【解决方案3】:
    foreach ( Delegate existingHandler in this.EventHandler.GetInvocationList() )
    {
        if ( existingHandler == prospectiveHandler )
        {
              return true;
        }
    }
    

    使用GetInvocationList 方法遍历委托。

    【讨论】:

    • 给人的印象是,根据其他帖子,GetInvocationList 并不总是可以访问...
    • 它是框架的一部分。完全可以接受。不能接受的是草率的代码错误地实现它并让对象随意放置。总是处理你的课程。根据您的要求,这是一种完全可以接受的做法。
    • “它是框架的一部分。完全可以接受。”我的意思是,如果事件来自第 3 方组件,您可能无权调用 GetInvocationList()。与可接受性不同。
    • .GetInvocationList() 仅在声明事件的类中可用。我如何在另一个类中使用它(例如我正在使用它的地方);我需要在 Monitor 类中确定有多少事件处理程序与事件相关联。我该怎么做?
    【解决方案4】:

    这里迟到的答案。我相信 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();
      }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2011-11-12
      相关资源
      最近更新 更多