Передача дополнительного аргумента делегату - PullRequest
3 голосов
/ 05 января 2012

У меня есть объект, который при запуске запрашивает некоторую информацию с сервера.Он отправляет идентификатор с сообщением, которое будет таким же, как и в ответе, поэтому он может быть уверен, что отвечает на правильное сообщение.В настоящее время код выглядит примерно так:

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

Это работает, но поскольку эти данные нужны только один раз, я бы хотел отписаться от этого события впоследствии, чего нельзя сделать с лямбдой,Если вместо этого я использую отдельную функцию, это позволяет мне отписаться, но кажется, что единственный способ передать параметр в функцию - через переменную класса.

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 Ответ

4 голосов
/ 05 января 2012

Вы можете отменить регистрацию лямбды, если сначала сохраните ее в переменной:

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...