在C#中与Lambdas解除事件

我经常遇到想要订阅事件的情况,但我想使用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代替。 在一个更复杂的例子中,lambda在这里非常方便。

我非常肯定,我运气不佳......但我想知道有没有人找到了这样做的方法?


毫无疑问,没有一个好办法来做到这一点。 你真的被两种选择中的一种困住了

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

  • 这个问题已经被问到

  • 如何取消订阅使用lambda表达式的事件?
  • 在C#中取消订阅匿名方法
  • 答案是:把你的lambda放入一个变量中。

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

    那么,如果你知道你的代码是唯一连接事件的代码,那么将null分配给事件变量将删除所有代理(但如果你希望代码是可扩展的,可以是非常糟糕的形式)。

    否则,你应该把lambda放在一个单独的变量中,并用它来解除事件。

    链接地址: http://www.djcxy.com/p/51465.html

    上一篇: UnHooking Events with Lambdas in C#

    下一篇: Weak events in .NET?