C# 添加EventHandler+;=事件处理程序?

C# 添加EventHandler+;=事件处理程序?,c#,.net,events,.net-3.5,C#,.net,Events,.net 3.5,我在a类中有一个SelectionChanged事件,我想通过B类传递该事件。我假设在B类中声明一个SelectionChanged事件并将此事件处理程序分配给a.SelectionChanged将导致B.SelectionChanged在触发a.SelectionChanged时触发-结果证明这是错误的 更清楚地说,一些代码: class A { public event EventHandler SelectionChanged; public void TriggerSele

我在a类中有一个
SelectionChanged
事件,我想通过B类传递该事件。我假设在B类中声明一个
SelectionChanged
事件并将此事件处理程序分配给
a.SelectionChanged
将导致
B.SelectionChanged
在触发
a.SelectionChanged
时触发-结果证明这是错误的

更清楚地说,一些代码:

class A
{
   public event EventHandler SelectionChanged;

   public void TriggerSelectionChanged()
   {
      if (SelectionChanged != null) SelectionChanged(this, EventArgs.Empty);
   }
}

class B
{
   private A _a = new A();

   public A A { get { return _a; } }

   public event EventHandler SelectionChanged;

   public B()
   {
      A.SelectionChanged += SelectionChanged;
   }

   public static void Test()
   {
      B relayer = new B();
      bool wasRelayed = false;
      relayer.SelectionChanged += delegate { wasRelayed = true; };
      relayer.A.TriggerSelectionChanged();

      System.Console.WriteLine("Relayed: {0}", wasRelayed);
   }
}
这将打印出“中继:错误”

将一个EventHandler添加到另一个EventHandler会产生什么影响

编辑:
注意!我知道解决这个问题的方法是通过委托、函数等传递事件,但我最感兴趣的是了解这段代码的效果。

您的代码中没有任何东西可以“连接”调用
B.SelectionChanged
a.SelectionChanged
。因此,当您在
a
上启动
SelectionChanged
时,不会调用在
B
上处理
SelectionChanged
的代理

我认为您希望B上的事件充当A公开的事件的适配器?如果是这种情况,则需要编写自己的
添加
/
删除
逻辑。见下文:

添加/删除的另一个示例:


在这种情况下,B的SelectionChanged和A的SelectionChanged不相关

如果要使B从A继承并删除B上的第二个声明,那么这将起作用

class A
{
   public EventHandler SelectionChanged;

   public void TriggerSelectionChanged()
   {
      if (SelectionChanged != null) SelectionChanged(this, EventArgs.Empty);
   }
}

class B : A
{
   public static void Test()
   {
      B relayer = new B();
      bool wasRelayed = false;
      relayer.SelectionChanged += delegate { wasRelayed = true; };
      relayer.TriggerSelectionChanged();

      System.Console.WriteLine("Relayed: {0}", wasRelayed);
   }
}
或者你也可以通过

class A
{
   public EventHandler SelectionChanged;

   public void TriggerSelectionChanged()
   {
      if (SelectionChanged != null) SelectionChanged(this, EventArgs.Empty);
   }
}

class B
{
   public B()
   {
     this._a.SelectionChanged += (o, s) => 
     {
       if(this.SelectionChanged != null) { this.SelectionChange(o, s); }
     };
   }




private A _a = new A();

   public A A { get { return _a; } }

   public EventHandler SelectionChanged;

   public static void Test()
   {
      B relayer = new B();
      bool wasRelayed = false;
      relayer.SelectionChanged += delegate { wasRelayed = true; };
      relayer.A.TriggerSelectionChanged();
      System.Console.WriteLine("Relayed: {0}", wasRelayed);
   }

}

事实证明,这是EventHandler作为委托的结果。这个类通过(或者我假设是这样)使用实现操作符+=。此函数的文档如下

连接指定多播(可组合)委托的调用列表


发生的情况是,分配给右侧EventHandler的所有处理程序都被添加到左侧的EventHandler。在这种情况下,没有处理程序,因此不会发生任何事情。但是,如果事情的顺序发生了变化,使得
B.SelectionChanged
B.SelectionChanged
连接到
A.SelectionChanged
之前就被分配了
。但是,从B中删除处理程序并不能将其从A中删除,因此这样做应该受到高度重视。

我认为OP希望B包含A,而不是扩展它。@larsm,我添加了类似的代码来完成您正在尝试的操作。我不认为你能在修改后的代码中做你正在尝试的事情,我认为它需要是一个委托。@Ian:这是我的退路。然而,我最关心的是EventHandler+=EventHandler的效果,而不是其他解决方案。@larsm:对不起,我明白了+我忘了添加连接B和A的构造函数,编辑了这个问题。