将额外的参数传递给委托

本文关键字:参数传递 | 更新日期: 2023-09-27 18:19:25

我有一个对象,它在启动时向服务器请求一些信息。它发送一个带有消息的标识符,该标识符在回复中是相同的,因此它可以确保它正在响应正确的消息。目前,代码大致如下所示:

void GetInitialData()
{
  string guid = Guid.NewGuid().ToString();
  Communicator.NewMessage += (sender, e)
    {
      if(e.Message.Id == guid)
        FillInfo();
    };
Communicator.SendMessage(new Message(stuff, guid));
}

这是可行的,但是由于这些数据只需要一次,所以我想在事后取消订阅事件,这是lambda无法做到的。如果我使用一个单独的函数,这允许我取消订阅,但似乎传递参数给函数的唯一方法是通过类变量。

string guid;
void GetInitialData()
{
  Communicator.NewMessage += MessageReceived;
  Communicator.SendMessage(new Message(stuff, guid));
}
void MessageReceived(object sender, MessageArgs e)
{
  if(e.Message.Id == guid)
  {
     FillInfo();
     Communicator.NewMessage -= MessageReceived;
  }
}

是否有一种方法可以让我取消订阅,并避免用额外的变量混淆类?

将额外的参数传递给委托

您可以在先将lambda存储在变量中时取消注册:

void GetInitialData()
{
    EventHandler<EventArgs> handler = null;
    handler = (sender, e) =>
    {
        if(e.Message.Id == guid)
        {
            FillInfo();
            Communicator.NewMessage -= handler;
        }
    };
    string guid = Guid.NewGuid().ToString();
    Communicator.NewMessage += handler;;
    Communicator.SendMessage(new Message(stuff, guid));
}