2012-01-06 65 views
1

在這種情況下,您可以使用c#創建一個事件集合,如列表,哈希集合和字典嗎?謝謝。事件詞典

+0

通過事件,你的意思是CLI事件與處理程序? – Minustar 2012-01-06 13:47:50

+1

你的用例是什麼? – BrokenGlass 2012-01-06 13:47:54

+1

您可以將*代表*存儲在列表或字典中,當然 - 您的意思是?也許你可以舉一個更清楚的例子嗎? (注:授權情況下將無法反映變化 - 它們是不可變的副本) – 2012-01-06 13:48:20

回答

5

當然可以的正確實例:

Dictionary<String, Delegate> m_events = new Dictionary<String, Delegate>(); 

在傑夫·裏希特的書CLR via C#你可以找到一個EventSet這樣類的完整實現。

(即使你沒有這本書,你可以從http://www.wintellect.com/Media/Default/Downloads/CLR_via_C_,_3rd_Edition_Code_by_Jeffrey_Richter_(January_20,_2010).zip下載示例代碼。有問題的類是在「Ch11-1-EventSet.cs」。)

至於問題去什麼事件是:

說你有這行代碼在你的類:

public event EventHandler<NewMailEventArgs> NewMail; 

那麼C#編譯器將轉換線之上分爲三個結構:

  1. 私人代表字段。 (喜歡的東西:private EventHandler<NewMailEventArgs> NewMail;

  2. 公共add_Xxx方法(其中xxx是事件的名稱),有興趣的用戶可以用它來註冊與事件的回調委託

  3. 公共remove_Xxx方法(其中xxx爲事件名稱)用戶可以使用從事件註銷。

(所有血淋淋的細節可以在上述書中11.2節找到。)

所以在其他禾rds你可以在你的Event集合類中存儲的'東西'只是一個普通的老式委託而已。

+0

立即閱讀... – irisjay 2012-01-06 14:32:48

+0

感謝您提供這樣一個良好的鏈接和明確的解釋。事實證明,你提供的鏈接似乎提供了一些東西,就像我所需要的。謝謝 – irisjay 2012-01-06 14:40:19

+0

這是我的榮幸。 – afrischke 2012-01-06 14:44:48

0

您可以使用IList無任何麻煩。類型T可以是以.net或用戶定義的類定義的任何類型。

+0

怎麼樣?你怎麼能聲明一個事件列表? – irisjay 2012-01-06 13:52:10

2

事件就像屬性或方法;你不能存儲它們的實例。你可以使用反射,但這可能不是你想要的。

你的意思是你想存儲一個方法列表,當你的事件被觸發時調用?事件已經做到了。

編輯:

嗯,我想我現在就買下。如果你只是簡單地解僱你的事件,那麼只有想要它的B實例才能得到它。如果傳入事件參數引發事件的A實例,那麼B實例將能夠告訴它來自哪裏。但是一個B永遠不會從一個沒有要求事件的A那裏得到一個事件。

編輯:

也許不是。你只想在B中的一個上發起一個事件?使B實現具有回調方法的接口。相反,觸發一個事件,調用方法上B.

+0

不,我有類A和類B.每個類B對象都有許多鏈接它的A對象。此外,每個A可以與多個燒烤工作,所以我想,如果我犯了一個詞典<字符串,事件>我可以調用相應的事件連接到A BS的所以只有一個將有觸發的事件 – irisjay 2012-01-06 14:03:56

+0

是的,我認爲這是有關我的意思。 – irisjay 2012-01-06 14:23:26

+0

不錯的主意。謝謝回答。 – irisjay 2012-01-06 14:39:18