在不知道名字的情况下删除事件

时间:2010-03-26 23:08:46

标签: c# events

是否可以代替这样做:

person.Walking -= person_Walking1;
person.Walking -= person_Walking2;
person.Walking -= person_Walking3;

这样做:

person.Walking = // remove all the handlers without knowing their names

感谢。

4 个答案:

答案 0 :(得分:4)

没有。部分事件是他们阻止你这样做。如果我订阅了一个按钮点击并且您订阅了一个按钮点击,那么你有什么权利删除我的处理程序? (好吧,那是拟人化的,但你明白了。)请注意,这不是知道事件处理程序的“名称”的问题 - 你必须能够提供对“相等”委托实例的引用。

例如,如果您使用匿名方法或lambda表达式订阅事件,则必须在某处保留对该事件的引用:

EventHandler handler = (sender, args) => Console.WriteLine("Clicked!");
button.Click += handler;
...
button.Click -= handler;

当您使用方法的名称时,正在从方法名称到委托实例执行方法组转换

button.Click += HandleEvent;
...
button.Click -= HandleEvent;

这里有两个单独的委托实例,但它们是相同的,因为它们具有相同的调用列表(它们做同样的事情)并且它们具有相同的目标(它们在同一个对象上“做” )。

编辑:我假设你只有可以作为一个事件访问它,而不是作为一个字段 - 如果你在发布事件的类中编写代码,你可以做你做的事情比如,并将该字段设置为null(或将其从集合中删除,或者您的实现工作正常)很好。

答案 1 :(得分:2)

不确定。只需设置:

person.Walking = null;

答案 2 :(得分:1)

这是事件发明的原因之一。如果你想做那样的事情,请使用委托。

答案 3 :(得分:0)

不是来自定义事件的类之外。如果真的想要,你可以定义一个这样的方法:

public void ClearEventListeners() {
    MyEvent.Clear();
}

(确切的调用可能不同,如果存在,但IntelliSense应指向正确的方向。)

相关问题