У меня есть объект, который при запуске запрашивает некоторую информацию с сервера. Он отправляет идентификатор с сообщением, которое будет одинаковым в ответе, поэтому оно может быть уверенным, что оно отвечает на правильное сообщение. В настоящее время код выглядит примерно так.Передача дополнительного аргумента делегату
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;
}
}
Есть ли способ обойти это, что позволит мне отказаться от подписки, а также избежать загромождения класса с дополнительными переменными?
Несмотря на это, я не вижу никаких преимуществ. Потому что каким-то образом какое-то тело должно хранить данные в этом случае события e. А так как его некоторая информация, то она должна быть какого-то типа. Следовательно, тип MessageArgs. Почему вы хотите избежать этого? Если да, то как еще вам хотелось бы узнать, какой тип события был сгенерирован? – Zenwalker