6

有没有办法执行事件处理连接的编译时间实施?执行事件处理连接

因此,例如让我说我有一个类,公开标准EventHandler<T>我可以确保该类的任何实例化的实例有OnMyEvent处理程序,处理? (最好在编译时)

我可以看到执行此操作的唯一方法是将事件处理程序作为对象构造函数的一部分或在运行时使用反射。有没有其他的选择?另外,如果C#不允许使用此功能,则可以使用此功能;但是,如果C#不允许使用此功能,则不需要使用此功能;否则,如果C#不允许使用此功能,出于好奇做任何其他语言?

回答

3

事件是通常用于可选消耗由所述对象的调用代码 - 例如,作为一个观察者(或多个观察者)。处理该事件的情况非常罕见,即强制执行。没有标准的语言/编译器构造来验证在编译时订阅的事件(我怀疑这会非常困难,因为您可以随时在代码中的任何位置有效地订阅/取消订阅 - 可能多次,即+ HandlerA,+ HandlerB,-HandlerA,-HandlerB-以没有订阅者结束)。

在你目前的情况下,它是需要,然后将它传递到构造听起来更合适,但我可能会在这种情况下(不EventHandler<T>)使用Func<...>Action<...>。但这是主观的。

其他方法:

  • 使它成为一个抽象类,并迫使消费者继承和override一个或更多的abstract成员
  • 有消费者必须提供
+0

interface参数谢谢你的答案。 :-) – 2011-05-31 14:22:17

+0

+1,用于解决OP所存在的一些根本问题和误解。我还会补充一点,如果你有一个构建脚本在构建之后运行单元测试,那么你可以在构建过程中执行许多事情,而编译器本身不能。 – Phil 2012-08-09 10:49:25