你可以通過反射來做到這一點,但它並不明顯。如果你在C#中聲明一個事件,一個字段將被添加到事件名稱爲「Event」的類中。如果您在該字段上調用GetValue,它將返回一個MulticastDelegate實例。
一旦你的MulticastDelegate,你可以調用列表,並調用反過來每個成員:
EventArgs e = new EventArgs(myClassInstance); // Create appropriate EventArgs
MulticastDelegate eventDelagate =
this.GetType().GetField(theEventName + "Event",
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic).GetValue(myClassInstance) as MulticastDelegate;
Delegate[] delegates = eventDelagate.GetInvocationList();
foreach (Delegate del in delegates) {
del.Method.Invoke(del.Target, new object[] { myClassInstance, e });
}
注意,這需要從實例中得到一個非公開領域,所以它只會在完全工作信任,而且非常有限。
是否有可能創建一個通用的Raise(),它接受要作爲參數引發的事件?因此它仍然會在課堂上被調用?
是的。修改上面的代碼來做到這一點相當容易。用這個替換「myClassInstance」。這實際上可以讓它在完全信任的情況下正常工作,因爲NonPublic BindingFlag將不再是一個問題。
通用方法遇到問題,該事件不能作爲屬性傳遞給你,給你的錯誤「只能發生在左邊」等解決方案是刪除事件關鍵字,該事件仍然正常工作,但可以沒有問題地傳遞,並且一般地提出。 – 2009-08-04 22:46:05