gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:46:42 25 4
gpt4 key购买 nike

是否可以代替这样做:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com