将额外的参数传递给委托
本文关键字:参数传递 | 更新日期: 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));
}