c# - 添加EventHandler += EventHandler有什么作用?

标签 c# .net events .net-3.5

我在 A 类中有一个 SelectionChanged 事件,我想通过 B 类中继。我假设在 B 类中声明一个 SelectionChanged 事件并将此事件处理程序分配给 A.SelectionChanged 会导致 B.SelectionChangedA.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);
   }
}

这会打印出“Relayed: false”。

将一个 EventHandler 添加到另一个 EventHandler 有什么影响?

编辑: 笔记!我知道解决此问题的方法是通过委托(delegate)、函数等传递事件,但我主要想知道这段代码的效果是什么。

最佳答案

您的代码中没有任何内容将 B.SelectionChanged 的调用“连接”到 A.SelectionChanged。因此,当您在 A 上触发 SelectionChanged 时,不会调用处理 B 上的 SelectionChanged 的委托(delegate)。

我认为您希望 B 上的事件充当 A 公开的事件的适配器?如果是这种情况,您将需要编写自己的 add/remove 逻辑。请参阅以下内容:

Events + Adapter Pattern

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

C#: event with explicity add/remove != typical event?

关于c# - 添加EventHandler += EventHandler有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6623004/

相关文章:

c# - 为什么在类型 '' 上声明的导航属性 '' 已配置有冲突的多重性。错误出现?

c# - 跨线程控制

c# - 如何在 C# 中以编程方式保存用户使用 CTRL-C 复制到剪贴板的 Outlook 电子邮件附件(例如 PDF)

c# - 与 C# 中的 NULL 混淆

c# - 为什么更改 ListView 的 HeaderStyle 会挂起应用程序?

javascript - jQuery:触发器不会在使用 .load() 加载的元素上触发

C# 在创建后更改字符串

.net - 如何在.NET 中等待另一个进程的状态?

javascript - Chrome 扩展 - 更改弹出图标 onClick/onHover

java - 使用 jna 进行 keyhook 和消费