转发/转发.NET事件

mar*_*jne 7 .net c# events

我的类有一个外部对象将订阅的事件:

public event EventHandler<MessageReceivedEventArgs> MessageReceived;
Run Code Online (Sandbox Code Playgroud)

但是,在其自己的线程上运行的内部Listener对象实际上将发起该事件.

private class Listener
{
    public void Run()
    {
         // events raised here which should be forwarded
         // to parent's MessageReceived
    }
};
Run Code Online (Sandbox Code Playgroud)

我倾向于在Listener上创建一个具有相同签名的事件,并在主类中订阅它以便在MessageReceived上引发它.这看起来有点麻烦,所以我想知道是否有一种简洁/惯用的方式来转发这样的事件.

Rya*_*rle 22

您可以使用事件添加/删除访问器,以便将连接到面向外部事件的事件"转发"到内部侦听器

public event EventHandler<MessageReceivedEventArgs> MessageReceived {
   add { this.listener.MessageRecieved += value; }
   remove { this.listener.MessageRecieved -= value; }
}
Run Code Online (Sandbox Code Playgroud)

这意味着您需要在侦听器中创建一个事件,但好处是没有其他管道来连接事件.

  • 这是一个很好的解决方案,但请注意,事件处理程序将接收Listener实例作为sender参数,这可能是一个问题...... (8认同)