将一个额外的参数传递给一个委托

时间:2012-01-05 07:46:21

标签: c# events delegates

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

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;
  }
}

有没有办法让我取消订阅并避免使用额外的变量使课程变得混乱?

1 个答案:

答案 0 :(得分:4)

首先将lambda存储在变量中时,可以取消注册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));
}