c# - 在不知道事件名称的情况下删除事件

标签 c# events

是否可以代替这样做:

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

这样做:

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

谢谢。

最佳答案

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

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

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

当您使用方法名称时,即执行从方法名称到委托(delegate)实例的方法组转换:

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

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

编辑:我假设您可以将其作为事件访问,而不是作为字段访问——如果您在发布事件的类中编写代码,您可以按照自己的意愿进行操作喜欢,并将该字段设置为空(或将其从集合中删除,或者您的实现有效)就可以了。

关于c# - 在不知道事件名称的情况下删除事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2527363/

相关文章:

c# - Blazor 动态生成表行

c# - LINQ 中的不同元素

c# - C# 中对象(带数组)的 API

javascript - JS addEventListener 参数

javascript - 如何从 Javascript 的内部函数访问父对象?

wpf - 如何以ReactiveUI方式处理windows事件(消息)?

c# - <链接 rel ="Stylesheet"类型 ="text/css"href ="<% ResolveUrl("~/Css/test.css") %>"/>

c# - 如何将 MDI 子窗体带到前面?

Android startActivityForResult 不返回日历数据

javascript - Onchange 处理大量输入 JS vanilla