在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放入一个变量中。
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?