“清除”委托中的所有链接方法c#
我有一种情况,我需要使用匿名方法语法( D += delegate(...){}
)将方法链接到委托D。 不过,我需要确保在添加新链接之前删除其他链接方法。
我知道我可以做类似D - = a,D + = b的东西,但由于我使用的是匿名方法,因此我不确定-=
是否可以工作(因为我没有明确的名称)。 。
如果我的推理是正确的,有没有办法使用匿名语法删除所有链接的方法?
提前致谢。
我不得不撤回我的原始答案,因为它是错误的,并且评论(在问题和我的答案下)提供了一些额外的信息。
对于事件和委托,您可以简单地使用=
来指定null(或新的侦听器)以摆脱所有其他侦听器 - 但只能在与事件/委托定义相同的类中。
我发现通过常规方法不可能将所有侦听器从未在同一类中声明的事件中移除,但可以通过查找事件/委托并使用FieldInfo.SetValue
为其指定null来完成。
以下是一个旧版SO问题的链接,这个问题可能与您的问题类似。 这个特殊的答案适用于我:https://stackoverflow.com/a/8108103/1659828
委托类型是不可变的类型 。 如果D
是委托类型的实例,则它由包含一个或多个项目的固定长度调用列表组成。
所以你不能“清除”清单。 你也不能创建一个空的调用列表的新实例,因为在没有方法存在的情况下使用null
引用(不是实例)。
示例( MyMethod
和JonnysMethod
是方法组,而不是委托变量):
Action D = null; // no object, no invocation list
D += MyMethod; // null and new Action(MyMethod) are combined; result is assigned to D
// D is an instance, invocation list length is 1
D += JonnysMethod; // two instances are combined; D is assigned to new instance; original instances are no longer referenced and will "soon" be garbage collected
// D is an instance, invocation list length is 2
D -= MyMethod; // D is assigned to a new instance again
D -= JonnysMethod; // D is assigned to null; no new instance
注意:如果D
确实是一个事件,要小心。 如果你outisde定义了D
的类/结构体, +=
和-=
是对事件访问器的调用。 所以在这种情况下,他们不是直接委托组合。 如果你在定义D
的类/结构中,并且如果D
是一个“类字段”事件,则D
可以用于两种意义。 作为委托变量(事件的“隐藏”后台字段)和事件。 +=
和-=
的含义可以用两种方式解释。 在C#3之前,它直接在后台领域被解释为委托组合。 在C#4和C#5中,语义发生了变化,在这种情况下, +=
和-=
是对事件访问器的调用。