2011-12-29 81 views
0

C#去了great lengths to ensure that you cannot "fire" an event,例如:C#:從對象外部觸發事件的替代方案是什麼?

form.FormClosed(this, new FormClosedEventArgs(CloseReason.UserClosing)); 

button.Click(this, new EventArgs()); 

customer.AddressChanged(this, new EventArgs()); 

不編譯,因爲你不能開除事件這種方式。

這似乎是語言設計師的一個有意識的決定。他們似乎故意試圖阻止「不良行爲」。

我正試圖找到打算替換。

實際例子:

void ShowPopup(Form form) 
{ 
    ToolStripDropDown toolDrop = new ToolStripDropDown(); 
    ToolStripControlHost toolHost = new ToolStripControlHost(form); 
    toolHost.Margin = new Padding(0); 
    toolDrop.Padding = new Padding(0); 
    toolDrop.Items.Add(toolHost); 

    toolDrop.Closed += toolDrop_Closed; 
    toolDrop.Show(screenLocation); 
} 

void toolDrop_Closed(object sender, ToolStripDropDownClosedEventArgs e) 
{ 
    //The form's FormClosed event doesn't fire when shown as a popup 
    //Fire the event manually 
    form.FormClosed(this, new FormClosedEventArgs(CloseReason.UserClosing)); 
} 

如果我不應該火在對象的外部事件 - 什麼是來取代它的技術?


如果沒有預期的替代觸發事件,有沒有解釋我如何應該處理這種情況的任何物品,書籍,或Channel 9視頻?

+0

我不認爲這有什麼關係。 NET,本身;而是一個對象成員可訪問性的函數。 – 2011-12-29 21:05:54

回答

4

一類的內部的事件已經經常使用的類的客戶端的公共方法從類的外部調用事件:如果某個事件的缺少這樣的公共「觸發」

public class Foo { 
    public event FooDelegate FooEvent; 

    public void RaiseFoo() { 
    if (FooEvent != null) FooEvent(); 
    }  
} 

,它通常意味着出於某種原因,你不應該能夠從外部舉辦活動。

在您的例子,事件當然可以與

form.Close(); 

用,有別於其他的事情提出,也引發事件。

+0

問題來自沒有可用於拋出所需事件的公共方法的類。 – 2011-12-30 19:51:10

+1

它只是意味着班級在內部引發事件,你可能不應該從外面做。當然,就像使用私人方法一樣,你可以通過反思來做到這一點,但這違背了某人的意圖。接收來自Win32消息的事件。由於循環捕獲的消息,它在消息循環內部引發。如果事件的真正原因(消息)沒有發生,那麼可以自己提出這種事件的原因是什麼? – 2011-12-30 20:01:01

相關問題