我有一个对象,它在启动时从服务器请求一些信息。它发送一个带有消息的标识符,该标识符与回复中的消息相同,因此可以确定它正在响应正确的消息。目前,代码大致如下所示。
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));
}
关于c# - 将额外参数传递给委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8739190/