C# 用C语言转发事件#

C# 用C语言转发事件#,c#,events,event-handling,c#-2.0,C#,Events,Event Handling,C# 2.0,我正在使用一个类来转发C#中的事件。我想知道有没有办法 它需要更少的代码开销 这是我到目前为止的一个例子 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() {

我正在使用一个类来转发C#中的事件。我想知道有没有办法 它需要更少的代码开销

这是我到目前为止的一个例子

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();
      }
   }
}
类引发原始事件。类B将其转发为EventB(本质上是相同的事件)。类A对其他模块隐藏,因此它们无法直接订阅EventA

我试图做的是减少类B中用于转发事件的代码开销,因为类B中通常没有真正的事件处理。此外,我将有几个不同的事件,因此需要在类B中编写大量只用于转发事件的OneEvent()方法

是否有可能以某种方式自动将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的订阅者引发事件。这就像是将某人的地址直接传递给大众营销公司,而你最初的方式更像是自己订阅大众营销公司,允许人们要求你向他们发送邮件副本。

IMO,你的原始代码(或多或少)是正确的。特别是,它允许您提供正确的
发送者
(对于认为自己正在订阅
B
上的事件的人,应该是
B
实例)

如果未订阅事件,有一些技巧可以减少运行时的开销,但这会添加更多代码:


这确实意味着
B.EventB
的订阅者得到了错误的发送者(
a
而不是
B
),但是-这可能很重要…真的,真的。。。当然,这取决于你认为什么是“错误的”。可能至少值得记录。如果你不关心发件人,那么这个模式是一个很好的问题,特别是因为你不应该忘记取消订阅EventA,否则可能会出现内存泄漏(你的对象B将保留在内存中,只要a是,即使它不再需要)。嗨,马克,我可以删除吗OnEventB方法中的“object sender”?object sender似乎是EventType的委托签名,而不是OnEventB方法?我意识到我无法删除第一个参数,因为它将被分配给m_A.EventA,我错了。
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) {
      eventB?.Invoke(this, args); // note "this", not "sender"

   }
}