在C#中转发事件
我正在使用一个在C#中转发事件的类。 我想知道是否有这样做的方式,需要较less的代码开销。
这是我迄今为止的一个例子。
class A { public event EventType EventA; } class B { A m_A = new A(); public event EventType EventB; public B() { m_A.EventA += OnEventA; } public void OnEventA() { if( EventB ) { EventB(); } } }
A级提出了原始事件。 B类转发它作为EventB(本质上是相同的事件)。 A类对其他模块是隐藏的,所以他们不能直接订阅EventA。
我想要做的是减less类B中用于转发事件的代码开销,因为通常在类B中没有实际处理事件。另外,我将有几个不同的事件,因此需要编写大量的OnEvent ()方法只能用于转发事件。
是否有可能以某种方式自动链接EventA到EventB,所以我有这样的事情:
class B { A m_A = new A(); public event EventType EventB; public B() { m_A.EventA += EventB; // EventA automatically raises EventB. } }
我使用C#2.0编译器顺便说一句。
绝对:
class B { private A m_a = new A(); public event EventType EventB { add { m_a.EventA += value; } remove { m_a.EventA -= value; } } }
换句话说,EventB订阅/取消订阅代码只是将订阅/取消订阅请求传递给EventA。
请注意,这不允许您仅针对订阅了EventB的订户而引发该事件。 就像直接把某个人的地址传递给一个大众营销公司一样,而你原来的方式更像是自己订阅大众营销公司,让人们要求你把邮件的副本发给他们。
国际海事组织,你的原始代码(或多或less)是正确的。 特别是,它允许你提供正确的sender
(对于认为他们正在订阅B
事件的人来说应该是B
实例)。
如果事件没有订阅,有一些技巧可以减less运行时的开销,但是这会增加更多的代码:
class B { A m_A = new A(); private EventType eventB; public event EventType EventB { add { // only subscribe when we have a subscriber ourselves bool first = eventB == null; eventB += value; if(first && eventB != null) m_A.EventA += OnEventB; } remove { // unsubscribe if we have no more subscribers eventB -= value; if(eventB == null) m_A.EventA -= OnEventB; } } protected void OnEventB(object sender, EventArgsType args) { EventType handler = eventB; if( handler !=null ) { handler(this, args); // note "this", not "sender" } } }