如何知道一個事件有多少事件處理程序?如何知道一個事件有多少事件處理程序?
我想要的方式來執行下面的代碼:
// 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