从 运行 时间创建的对象订阅事件

Subscribe to an event from an object created at run time

我有一个服务器 class,它在 运行 接收到新连接时创建一个 ClientHandler 对象。在 ClientHandler 内部,我需要在收到特定消息时触发 clientEvent。在我的表单 class 中,我引用了服务器 class 但我需要订阅 ClientHandler 对象中的 clientEvent。但是,该对象在设计时尚不存在。如何订阅?

我在订阅 clientEvent 的服务器中创建了一个事件处理程序,它引发了另一个 serverEvent。在表单 class 中,我订阅了 serverEvent。这样我就间接地监听了 clientEvent。但我相信有更好的方法来做到这一点。

public delegate void SomeEvent(string message);

public class Server
{
  public ClientHandler clientHandler;
  public event SomeEvent serverEvent;
  // callback function when new connection received
  public void on_connected()
  {
    clientHandler = new ClientHandler(...)
    clientHandler.clientEvent += ClientEventHandler;
    }
  public void ClientEventHandler(string message)
  {
    serverEvent?.Invoke(message)
  }
}

public class ClientHandler
{
  public event SomeEvent clientEvent;
  // callback when message is read
  void ReadCallback(...)
  {
    ...
    // Some message received
    clientEvent?.Invoke("Message received: " + someMessage);
  }

public partial class From1 : Form
{
  public Form1()
  {
   Server server = new Server(...);
   server.serverEvent += serverEventHandler;
   ...
  }
  private void serverEventHandler(string message)
  {
   // do something with message
  }
}

这种方法没有任何问题,只要您确定在删除 child 时取消订阅活动即可。

以下是解决这个问题的 3 种主要方法

  1. Parent订阅child[=34]的事件 =], 取消订阅child 被移除时
  2. parent引用传递给child , 需要时在parent上调用事件。这可能会更整洁(有时)并且更易于管理。
  3. 通过 事件聚合器 之类的东西使用 解耦消息,它将转发 事件 来自发布者订阅者。它们是 解耦的 因为它们不需要相互了解并且可以一起跳过 parent