2012-01-06 80 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