2010-08-22 31 views
4

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

我想要的方式来执行下面的代码:

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

注意:此代码是从一侧的控制类。

在此先感谢。

回答

3

你不能,因为只有暴露事件的类型才能访问实际的委托。在控制之内,你可以做这样的事情:

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

或者,你想做什么:

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

该代码将总是抛出一个NullReferenceException或进入'if'块......没有这样的事情作为一个没有动作的委托实例。 – 2010-08-22 12:29:06

+0

@Jon,好点...我会修复它 – 2010-08-22 12:30:05

+0

这段代码只有在类里面写的时候才起作用,但是我说的是在类之外的事件处理函数中加入一个事件,所以这个解决方案没有' t为第二种情况工作 – Homam 2010-08-22 12:34:06

1

我的回答是更托马斯Levesque的评论,但我还不能评论,所以这里什么都不做。我找到的C#难看一点这方面,因为有引入竞争条件的可能性 - 即不同的线程可以比赛,你可以用CheckedChanged != null

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

进入if声明您应该锁定这个代码,但在许多情况下,你会发现自己写这样的代码

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

但SomeEvent可以在这个过程中被清零,所以这将是更安全的写类似这样

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

...只是为了更安全。

相关问题