C# 如何在运行时操纵委托的调用列表?

C# 如何在运行时操纵委托的调用列表?,c#,winforms,reflection,delegates,C#,Winforms,Reflection,Delegates,我想知道如何从父委托的调用列表中删除单个委托 <DelegateName>.RemoveAll(); .RemoveAll(); 现在,我可以删除所有,这将工作只是为了得到运动的想法,看看是否工作,它应该,但然后任何代表删除将需要在运行时再次添加 所以 foreach(Delegate d in <DelegateName>.getInvocationList) { // do something with 'D'?? } foreach(getInvocation

我想知道如何从父委托的调用列表中删除单个委托

<DelegateName>.RemoveAll();
.RemoveAll();
现在,我可以删除所有,这将工作只是为了得到运动的想法,看看是否工作,它应该,但然后任何代表删除将需要在运行时再次添加

所以

foreach(Delegate d in <DelegateName>.getInvocationList)
{ // do something with 'D'?? }
foreach(getInvocationList中的委托d)
{//用“D”做点什么?}
现在我可以访问'D'了,我可以把它放到.Remove()中,但它需要两个参数???请帮我拿一下好吗

最后,删除代理后,重新添加代理的最佳方式是什么? 所以我认为反射可能在其中起作用,但这要由你们来决定

更新:


本质上,有一个全局委托,它有许多事件存在于作为其实例的不同winforms类中。所有这些事件都有一个处理程序,在触发事件时处理该事件。位于顶部的委托始终控制所有与其签名匹配的处理程序被激发。我想在顶部处理这个委托,我想删除所有处理程序,然后在运行时重新添加它们。顶部的委托是一个多播委托,它的调用列表是一个单独委托的列表,依次指向我添加的四个处理程序之一。我希望这是有意义的,这是我正在做的事情的一般想法。

你不能-代理是不变的。您可以创建一个与旧委托等效的新委托,而无需执行某些操作,但您无法就地修改现有委托。

调用列表是委托的内部部分,您无法正常修改它。您可能可以通过非常脏的反射来实现这一点,但我认为这对于生产代码来说并不是一个有效的想法。但有另一种方法可以有效地解决这个问题。您可以定义
事件
,而无需自动参考底图委托并自行控制调用列表。为此,您需要使用显式的
add
remove
关键字定义事件,请参阅。你必须重新实现一些东西,但它会给你完全的控制权。

谢谢Jon,我昨晚刚读到,但是我们不能使用二进制运算符“-=”或“+=”来添加和删除调用列表中的委托吗?这只是一个想法…@Ibramumtaz:不,这些不会改变现有的委托-它们会在旧委托的基础上返回一个新委托。