c# - 将额外参数传递给委托(delegate)

标签 c# events delegates

我有一个对象,它在启动时从服务器请求一些信息。它发送一个带有消息的标识符,该标识符与回复中的消息相同,因此可以确定它正在响应正确的消息。目前,代码大致如下所示。

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/

相关文章:

javascript - jQuery - 以编程方式触发事件

c++ - QListView 样式表不适用于委托(delegate)

objective-c - 在发送消息之前检查有效的委托(delegate)对象

asp.net - AutoCompleteBox 中的 'enter' 不会触发 KeyDown 事件

将多个 ViewController 推送到 NavigationController 堆栈时的 iOS 委托(delegate)问题

c# - 验证 xml 节点,而不是整个文档

c# - 如何在 C# 中比较 IP 地址范围?

c# - 在 Blazor .net core 应用程序中查找连接字符串时出错

c# - 将一个类移动到不同的命名空间,是否可以向我的文件添加隐式使用?

javascript - 如何区分 onKeyDown 和 onClick 事件(输入 =“radio” )