代码之家  ›  专栏  ›  技术社区  ›  Homam

如何知道一个事件有多少个事件处理程序?

  •  4
  • Homam  · 技术社区  · 14 年前

    如何知道一个事件有多少个事件处理程序?

    我想要一种执行以下代码的方法:

    // if (control.CheckedChanged.Handlers.Length == 0)
    {
        control.CheckedChanged += (s, e) =>
        {
          // code;
        }
    }
    

    注意:此代码在控件类之外。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Thomas Levesque    14 年前

    不能,因为只有公开事件的类型才能访问实际委托。在控制范围内,你可以这样做:

    if (MyEvent!= null)
    {
        EventHandler[] handlers = (EventHandler[])MyEvent.GetInvocationList();
        foreach(EventHandler handler in handlers)
        {
            ...
        }
    }
    

    if (CheckedChanged == null)
    {
        CheckedChanged += (s, e) =>
        {
          // code;
        }
    }
    
        2
  •  1
  •   Gleno    14 年前

    我的回答更多的是对托马斯·列夫斯克的评论,但我还不能评论,所以这里什么也没说。我发现C#的这个区域有点难看,因为有可能引入争用条件,即不同的线程可能会争用,而您可能会进入 if CheckedChanged != null

    if (CheckedChanged == null)
    {
        CheckedChanged += (s, e) =>
        {
          // code;
        }
    }
    

    您应该锁定此代码,但在许多情况下,您会发现自己正在编写这样的代码

    //Invoke SomeEvent if there are any handlers  attached to it.
    if(SomeEvent != null) SomeEvent(); 
    

    但是SomeEvent在这个过程中可能为null,所以这样写会更安全

    SomeEVentHandler handler = SomeEvent;
    if (handler != null) handler();