我想转播一个事件。目前,我在构造函数中拦截InnerEvent,并像这样中继:
obj.InnerEvent+=(...)=>{
if(OuterEvent != null)
OuterEvent(...);
}
但是它看起来很糟糕,所以我发现中继可以在事件级别完成添加/删除关键字,像这样:
event Handler OuterEvent{
add{ obj.InnerEvent+=value;}
remove{ obj.InnerEvent+=value;}
}
但在这一点上,我不能再引发我的OuterEvent。我知道为什么它不是直接可能的(阅读这里),但我不能找出一个体面的方式来保持提高我的OuterEvent。我应该像往常一样在构造函数中绑定和中继吗?最好的技巧是什么?
在某种意义上,当您使用第二种方法时,OuterEvent
不再作为事件存在。它现在只不过是订阅obj
的InnerEvent
的一种方式,因此OuterEvent
现在实际上是与InnerEvent
相同的事件:没有支持OuterEvent
的委托,只调用该事件的订阅者。因此,调用OuterEvent
的唯一方法是引发InnerEvent
。
解决方法是公开从obj
外部增加InnerEvent
的方法,但我认为这是不好的做法。如果您也需要从外部类调用OuterEvent
,我更愿意坚持使用第一个方法。在OuterEvent
确实只转发InnerEvent
的情况下,第二种方法非常优雅。