如何知道事件的事件处理程序数量?

时间:2010-08-22 12:22:11

标签: c# .net events delegates

如何知道事件的事件处理程序数量?

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

您不能,因为只有公开事件的类型才能访问实际的委托。在控件内,你可以做类似的事情:

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

或者,对于你想要做的事情:

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

答案 1 :(得分:1)

我的回答更多是对托马斯·莱维斯克的评论,但我还没有发表评论,所以这里什么都没有。我发现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可能会在这个过程中被淘汰,所以写这样的东西会更安全

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

......只是为了更安全。