“清除”委托中的所有链接方法c#

我有一种情况,我需要使用匿名方法语法( D += delegate(...){} )将方法链接到委托D。 不过,我需要确保在添加新链接之前删除其他链接方法。

我知道我可以做类似D - = a,D + = b的东西,但由于我使用的是匿名方法,因此我不确定-=是否可以工作(因为我没有明确的名称)。 。

如果我的推理是正确的,有没有办法使用匿名语法删除所有链接的方法?

提前致谢。


我不得不撤回我的原始答案,因为它是错误的,并且评论(在问题和我的答案下)提供了一些额外的信息。

对于事件和委托,您可以简单地使用=来指定null(或新的侦听器)以摆脱所有其他侦听器 - 但只能在与事件/委托定义相同的类中。

我发现通过常规方法不可能将所有侦听器从未在同一类中声明的事件中移除,但可以通过查找事件/委托并使用FieldInfo.SetValue为其指定null来完成。

以下是一个旧版SO问题的链接,这个问题可能与您的问题类似。 这个特殊的答案适用于我:https://stackoverflow.com/a/8108103/1659828


委托类型是不可变的类型 。 如果D是委托类型的实例,则它由包含一个或多个项目的固定长度调用列表组成。

所以你不能“清除”清单。 你也不能创建一个空的调用列表的新实例,因为在没有方法存在的情况下使用null引用(不是实例)。

示例( MyMethodJonnysMethod是方法组,而不是委托变量):

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中,语义发生了变化,在这种情况下, +=-=是对事件访问器的调用。

链接地址: http://www.djcxy.com/p/51447.html

上一篇: "Clearing" all chained methods in delegate c#

下一篇: Unsubscribing from anonymous delegate event