如何知道一个事件有多少事件处理程序?如何知道一个事件有多少事件处理程序?
我想要的方式来执行下面的代码:
// if (control.CheckedChanged.Handlers.Length == 0)
{
control.CheckedChanged += (s, e) =>
{
// code;
}
}
注意:此代码是从一侧的控制类。
在此先感谢。
如何知道一个事件有多少事件处理程序?如何知道一个事件有多少事件处理程序?
我想要的方式来执行下面的代码:
// if (control.CheckedChanged.Handlers.Length == 0)
{
control.CheckedChanged += (s, e) =>
{
// code;
}
}
注意:此代码是从一侧的控制类。
在此先感谢。
你不能,因为只有暴露事件的类型才能访问实际的委托。在控制之内,你可以做这样的事情:
if (MyEvent!= null)
{
EventHandler[] handlers = (EventHandler[])MyEvent.GetInvocationList();
foreach(EventHandler handler in handlers)
{
...
}
}
或者,你想做什么:
if (CheckedChanged == null)
{
CheckedChanged += (s, e) =>
{
// code;
}
}
我的回答是更托马斯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();
...只是为了更安全。
该代码将总是抛出一个NullReferenceException或进入'if'块......没有这样的事情作为一个没有动作的委托实例。 – 2010-08-22 12:29:06
@Jon,好点...我会修复它 – 2010-08-22 12:30:05
这段代码只有在类里面写的时候才起作用,但是我说的是在类之外的事件处理函数中加入一个事件,所以这个解决方案没有' t为第二种情况工作 – Homam 2010-08-22 12:34:06