【问题标题】:Is it possible to register one event to another without helper method in C#?是否可以在没有 C# 中的辅助方法的情况下将一个事件注册到另一个事件?
【发布时间】:2024-04-30 20:05:03
【问题描述】:

我在不同的班级有两个相同的事件:

A.eventA

B.eventB

这两个事件:eventA 和 eventB 是通过同一个委托定义的,因此这些事件具有相同的返回值和参数。是否可以在触发 B.eventB 的那一刻触发 A.eventA?

我可以写一个方法:

void return-value-of-delegate connect(parameters of delegate)
{
   if (A.eventA != null)
   {
      A.eventA(parameters of delegate);
   }
}

我只是想知道是否可以缩短我的代码。

谢谢!

(注意:我的代码是一个 WPF 项目,因此是 WPF 标记。)

编辑:在 A 类中是对 B 类的引用。

【问题讨论】:

    标签: c# wpf events


    【解决方案1】:

    每当EventB 触发时,EventA 也会触发:

    class A {
      private B b;
      public event EventHandler EventA {
        add {
          b.EventB += value;
        }
        remove {
          b.EventB -= value;
        }
      }
      public A() {
        b = new B();
      }
      // ...
    }
    

    现在所有的事件监听器都注册在 B 类中。

    【讨论】:

    • 看来这就是我要找的东西。看起来比新方法方便多了!谢谢!
    • @Dan Puzey:一个公平的观察。但是否是这种情况取决于问题的具体情况,以及 A 和 B 之间的关系。在some cases 中非常有意义。
    【解决方案2】:

    你不能在课堂之外引发事件。只有类本身可以引发它自己的事件。另一方面,您可以公开一个接受相同参数的公共方法,该方法在内部引发指定事件。

    使用Reflection 也不是一个选项,它只允许您订阅和从另一个类的事件中删除订阅。

    【讨论】:

      【解决方案3】:

      不,你不能,除非代码在声明事件的类中。事件只能从声明类中触发。您可能必须使用来自两个类的参数来使用一个事件并作为回报触发该事件,但是您不能保证它们将同时被触发,只是大约在同一时间,具体取决于注册到每个事件的方法,因为它们将在同一个线程中执行。

      【讨论】:

        【解决方案4】:

        事件在不同的类中定义的事实意味着它们不是相同的事件,即使它们可能具有相同的签名。您不能同时从两个不同的类触发事件。

        除其他事项外,请考虑事件通常是从类的实例 触发的。当A.eventA 发生时,你会触发B.eventB 的哪个实例?

        【讨论】:

        • 我在 A 类中引用了 B 类。我忘了提及它,抱歉。
        最近更新 更多