2009-08-04 46 views
3
public class a 
{ 
    public event eventhandler test; 
    public void RaiseTest(){//fire test} 
} 

是否可以在不調用方法的情況下從此類外部對此類進行測試?是否有可能在沒有自定義函數的情況下在對象外引發事件

基本上我有大量的事件必須根據外部源提出,並且不想爲每個事件創建一個Raise()函數。

是否有可能創建一個通用的Raise(),它接受要作爲參數引發的事件?因此它仍然會在課堂上被調用?

回答

4

你可以通過反射來做到這一點,但它並不明顯。如果你在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將不再是一個問題。

+0

通用方法遇到問題,該事件不能作爲屬性傳遞給你,給你的錯誤「只能發生在左邊」等解決方案是刪除事件關鍵字,該事件仍然正常工作,但可以沒有問題地傳遞,並且一般地提出。 – 2009-08-04 22:46:05

2

是否有可能在沒有調用方法的情況下從這個類的外部對這個類進行測試?

簡答:沒有。

只有類聲明事件可以提高它

是否有可能創建一個接受被提出作爲參數的情況下的一般加薪()?因此它仍然會在課堂上被調用?

我不這麼認爲,至少不容易......即使使用反射,也沒有EventInfo.Invoke方法。 AFAIK,提高事件的唯一方法是在課堂上靜態編輯

編輯:實際上它可以做到(請參閱Reed的答案),但是限制了應用程序必須以完全信任的方式運行。

+0

托馬斯:看到我的答案如何通過反射來處理這個問題。在完全信任的情況下,你也可以從課外做到這一點。在部分信任中,您可以將其設置爲將此事件稱爲以事件名稱作爲參數的方法。 – 2009-08-04 22:37:36

相關問題