在C#中使用Lambda的UnHooking事件#

我经常遇到想要订阅事件的情况,但我想使用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在引擎盖下创建了一个匿名委托,我没有什么可以调用的-= on。

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

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

然后我可以挂钩/取消所有我想要的东西:

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

但我真的非常非常喜欢使用我的lambda。 在一个更复杂的例子中,lambdas在这里非常方便。

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

不可思议的是,没有一个很好的方法可以做到这一点。 您真的遇到了两种选择之一

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

这个问题已经被问到了

  • 如何取消订阅使用lambda表达式的事件?
  • 在C#中取消订阅匿名方法

答案是:将lambda放在一个变量中。

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

好吧,如果你知道你的代码是唯一一个连接事件的代码,那么为事件变量赋值null将删除所有代理(但如果你希望代码是可扩展的,那么可能是非常糟糕的代码)。

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