2012-01-05 3 views
3

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

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

Есть ли способ обойти это, что позволит мне отказаться от подписки, а также избежать загромождения класса с дополнительными переменными?

+0

Несмотря на это, я не вижу никаких преимуществ. Потому что каким-то образом какое-то тело должно хранить данные в этом случае события e. А так как его некоторая информация, то она должна быть какого-то типа. Следовательно, тип MessageArgs. Почему вы хотите избежать этого? Если да, то как еще вам хотелось бы узнать, какой тип события был сгенерирован? – Zenwalker

ответ

4

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

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)); 
} 
Смежные вопросы