2010-10-17 34 views
1

我在窗體上有一堆按鈕,並且在我的代碼中的某個點上,我想強制啓動Click事件。我可以這樣做:C#:如何使用反射調用事件?

if (myButton == btnFoo) 
    btnFoo_Click(this, new EventArgs()); 
else if (myButton == btnBar) 
    btnBar_Click(this, new EventArgs()); 
else if // blah blah 
    ... 

顯然這並不理想。這看起來像是一種反思,但我找不到正確的方法來做到這一點,例如,

var ei = myButton.GetType().GetEvent("Click"); // so far so good; 
var mi = ei.GetRaiseMethod(); // always returns null - no good! 

GetRaiseMethod的文檔。

那麼如何強制點擊代碼運行?

+0

從那時候同一頁面的按鈕:「這個方法返回null與C#事件的關鍵字或Visual Basic中的事件關鍵字聲明事件,這是因爲C#和Visual Basic編譯器不會生成這樣的方法。「 – 2010-10-17 16:38:57

回答

3

使用PerformClick方法:

myButton.PerformClick(); 

也許你要投給巴頓,我無法從你的代碼段告訴。我會假設你不需要追求反射代碼:)

+0

+1:哦,好多了。不知道這種方法。 – Ani 2010-10-17 16:56:36

+0

我還沒有發現它。儘管如此,我認爲我仍然會質疑總體設計 - 至少值得再給它一次,看看是否有更清晰的方法。 – 2010-10-17 17:33:11

4

一般來說,你不能。事件的要點是允許客戶訂閱和取消訂閱 - 應該由發行商來提高事件。事實上,即使 a GetRaiseMethod在我看來有點奇怪 - 並且在C#中不受支持(您只能指定添加/刪除方法)。

一種選擇是有一個類似的Dictionary<Button, EventHandler>什麼的,太註冊所有的事件處理程序有......但爲什麼要強制click事件,有效地激發擺在首位,你可能想在反映。也許有更好的設計可以避免這個問題。

+1

因此,GetRaiseMethod()不適用於C#生成的事件,它只適用於也使用SetRaiseMethod()的動態代碼。如果你在C#生成的東西上使用GetRaiseMethod(),你總是會得到'null'。 – Doug 2011-02-01 23:01:23

0

Jon Skeet是對的;就「合同」而言,有一個addremove方法,就是這樣。實際上,不能保證該事件被實現爲具有支持多播委託的「類字段」事件。可能存在任何支持數據結構來存儲每個回叫(或根本不存在)。因此,對象上的「引發事件」通常是,一般而言沒有明確定義。

編輯:刪除基於反射的建議。跟@Hans Passant一起去吧。

1

我有一個類似的問題。我有一個控件,點擊時會引發點擊事件。我想在按下快捷鍵時提出事件,這由我的表單上的組件進行監視。爲了實現這一點,我將下面的代碼添加到我的自定義控件中。

public void PerformClick() 
{    
    OnClick(new EventArgs()); 
} 

我這時只要按使用

ctl.PerformClick();