引发事件,转发另一个事件

本文关键字:事件 另一个 转发 | 更新日期: 2023-09-27 18:04:41

我想转播一个事件。目前,我在构造函数中拦截InnerEvent,并像这样中继:

obj.InnerEvent+=(...)=>{
    if(OuterEvent != null)
        OuterEvent(...);
}

但是它看起来很糟糕,所以我发现中继可以在事件级别完成添加/删除关键字,像这样:

event Handler OuterEvent{
  add{ obj.InnerEvent+=value;}
  remove{ obj.InnerEvent+=value;}
}

但在这一点上,我不能再引发我的OuterEvent。我知道为什么它不是直接可能的(阅读这里),但我不能找出一个体面的方式来保持提高我的OuterEvent。我应该像往常一样在构造函数中绑定和中继吗?最好的技巧是什么?

引发事件,转发另一个事件

在某种意义上,当您使用第二种方法时,OuterEvent不再作为事件存在。它现在只不过是订阅objInnerEvent的一种方式,因此OuterEvent现在实际上是与InnerEvent相同的事件:没有支持OuterEvent的委托,只调用该事件的订阅者。因此,调用OuterEvent的唯一方法是引发InnerEvent

解决方法是公开从obj外部增加InnerEvent的方法,但我认为这是不好的做法。如果您也需要从外部类调用OuterEvent,我更愿意坚持使用第一个方法。在OuterEvent确实只转发InnerEvent的情况下,第二种方法非常优雅。