是否可以代替这样做:
person.Walking -= person_Walking1;
person.Walking -= person_Walking2;
person.Walking -= person_Walking3;
这样做:
person.Walking = // remove all the handlers without knowing their names
感谢。
答案 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应指向正确的方向。)