我有一种情况,我需要使用匿名方法语法 ( D += delegate(...){}
)将方法链接到委托 D。但是,我需要确保在添加新方法之前删除了其他链接方法。
我知道我可以执行 D -= a、D += b 之类的操作,但由于我使用的是匿名方法,因此我不确定这是否-=
可行(因为我没有明确的名称。)。
如果我的推理是正确的,有没有办法可以使用匿名语法删除所有链接的方法?
提前致谢。
我不得不撤回我原来的答案,因为它太错误了,并且评论(在问题和我的答案下)提供了一些额外的信息。
对于事件和委托,您可以简单地分配 null(或新的侦听器)=
以摆脱所有其他侦听器 - 但只能在定义事件/委托的同一类中。
我发现不可能通过常规方式从未在同一类中声明的事件中删除所有侦听器,但是您可以通过找到事件/委托并使用FieldInfo.SetValue
.
这是一个较旧的 SO 问题的链接,该问题可能与您的问题有类似的限制。这个特别的答案对我有用: https ://stackoverflow.com/a/8108103/1659828
委托类型是不可变类型。IfD
是委托类型的一个实例,它由一个具有一个或多个项目的固定长度调用列表组成。
所以你不能“清除”列表。您也不能创建具有空调用列表的新实例,因为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
真的是一个事件,请小心。如果您超出了D
定义的类/结构,+=
并且-=
是对事件访问器的调用。因此,在这种情况下,它们不是直接代表组合。如果您在定义 的类/结构中D
,并且 ifD
是“类字段”事件,D
则可以在两种意义上使用。作为委托变量(事件的“隐藏”支持字段)和事件。+=
和的含义-=
可以用两种方式来解释。在 C# 3 之前,它被解释为直接在支持字段上的委托组合。在 C# 4 和 C# 5 中,语义发生了变化,+=
并且-=
在这种情况下是对事件访问器的调用。