【发布时间】:2011-08-16 22:58:25
【问题描述】:
我将“事件”放在引号中,因为我意识到它是一种语法糖,而不是真正的类型。
我有一些事件被简单地链接到另一个类中的匹配事件。所以当事件引发时,段落就像
Raiser -> 代理 -> 订阅者
所以在代理类中我有一个像这样的通用模式:
Raiser.SomeEvent +=
(_, args) =>
{
if (this.SomeEvent != null)
this.SomeEvent(this, args);
};
为了整理我的代码,我想将它移到另一个方法,该方法返回一个包装了上述事件调用代码的新委托:
public static EventHandler GetHandlerDelegate(EventHandler handler, Object sender)
{
return
(_, args) =>
{
if (handler != null)
handler(sender, args);
};
}
然后在代理中我可以这样做:
Raiser.SomeEvent += GetHandlerDelegate(this.SomeEvent, this);
哪个更整洁。
好吧,只要订阅者在上述调用之后 不决定订阅 Proxy.SomeEvent 就可以了。不幸的是,我没有像我希望的那样通过引用传递“事件”;我现在明白我只是传递调用列表,所以当OtherClass.SomeEvent 发生并且调用匿名方法并调用它所提供的“事件”(委托)时,只有已添加到该事件的委托在我调用 GetHandlerDelegate() 的时候会被调用。虽然这实际上足以满足我目前的情况,但以这种方式编码确实是不可接受的。
我已经阅读了其他一些 SO 问题,并且我收集了一些称为 Reactive Extensions 的东西可能会有所帮助,但目前我正在寻找一种更简单的解决方案(如果有的话)。 (如果没有,我就不会这样做。)
有没有其他方法可以完成我正在尝试做的事情,而没有上述缺点?
如果这个问题不清楚,请参阅my answer,希望有助于澄清它。
【问题讨论】:
标签: c# .net events delegates anonymous-methods