【问题标题】:UnHooking Events with Lambdas in C#在 C# 中使用 Lambda 取消挂钩事件
【发布时间】:2009-05-13 19:30:08
【问题描述】:

我经常遇到想订阅一个事件,但又想使用 lambda 的情况:

public class Observable
{
    public event EventHandler SomethingHappened;

    public void DoSomething()
    {
        // Do Something...
        OnSomethingHappened();
    }
}

// Somewhere else, I hook the event
observable.SomethingHappened += (sender, args) => Console.WriteLine("Something Happened");

我遇到的问题是我不知道如何解开事件。由于 lambda 在后台创建了一个匿名委托,因此我没有什么可以调用 -= 的。

现在,我可以创建一个方法:

private void SomethingHappened(object sender, EventArgs args)
{
    Console.WriteLine("Something Happened");
}

然后我可以随心所欲地挂接/解挂:

observable.SomethingHappened += SomethingHappened;
observable.SomethingHappened -= SomethingHappened;

但我真的,真的,真的很想改用我的 lambda。在一个更复杂的例子中,lambda 在这里非常方便。

我很确定我很不走运……但我想知道是否有人想出了办法做到这一点?

【问题讨论】:

标签: c# events lambda


【解决方案1】:

这个问题已经问过了

答案是:将你的 lambda 放入一个变量中。

EventHandler handler = (sender, args) => Console.WriteLine("Something Happened");
observable.SomethingHappened +=  handler;
observable.SomethingHappened -=  handler;

【讨论】:

  • 你不能使用这个,因为 lambda 不能分配给 var。相反,您应该使用 [delegate notation] (stackoverflow.com/questions/805829/…),或者使用实际事件类型而不是 var。
【解决方案2】:

不幸的是,没有一个很好的方法可以做到这一点。你真的被两种选择之一困住了

  • 使用您描述的方法
  • 将 lambda 分配给变量并使用该变量添加/删除事件

【讨论】:

  • 在某些情况下,第二个选项会很有用。谢谢。
  • 我一直使用第二种方法,从未真正想过使用 lambda。
  • @Niel:第二种方法使用 lambdas。
  • 一个例子会让这个答案更有用。
【解决方案3】:

好吧,如果您知道您的代码是唯一连接事件的代码,则将 null 分配给事件变量将删除所有委托(但如果您希望代码可扩展,这可能是一种非常糟糕的形式)。

否则,您应该将 lambda 保留在一个单独的变量中,并使用它来取消事件挂钩。

【讨论】:

  • 你不能这样做。只有拥有该事件的类才能将事件属性设置为 null。 Observable 的客户端可能不会这样做。如果事件是多播委托,客户端可以设置为 null,但禁止事件。无论哪种情况,我都同意。格式不好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2018-02-14
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多