2010-08-03 40 views
4

我想知道如何去除父代表的调用列表中的各个委托。如何在运行时操作委托的调用列表?

<DelegateName>.RemoveAll(); 

现在我就可以删除所有,并且将工作只是为了让这个想法在运动和看的作品,它应该,但随后的任何委托删除在运行时需要再次加入!

这样:...

foreach(Delegate d in <DelegateName>.getInvocationList) 
{ // do something with 'D'?? } 

现在,我有机会获得“d”我可以将其放到一个卸下摆臂(),但它requies两个参数???请给我一些帮助吗?

最后,一旦委托被删除,重新添加它的最佳方式是什么? 所以我假设Reflection可能会在这个方面发挥作用,但对你们来说。

UPDATE:

本质上说是有许多事件在生活是它的实例不同的WinForms类全局委托。所有这些事件都有一个处理器,当它被触发时处理事件。代表队一直在最高层管理与其签名匹配的所有处理程序被解雇。我想在顶部讨论这个委托,我想删除所有的处理程序,然后在运行时重新添加它们。所以上面的委托是一个多播委托,它的调用列表是一个单独的委托列表,它们又指向我已经添加的四个处理器之一。我希望这是有道理的,这是我正在做什么的一般概念。

+0

委托或事件? – 2010-08-03 13:13:21

回答

6

你不能 - 代表是不可变的。您可以创建一个新的委托,该委托与没有特定操作的旧委托相同,但不能就地修改现有的委托。

+0

谢谢乔恩,我刚刚读了昨晚,但我们不能使用二元运算符' - ='或'+ ='来添加和删除调用列表中的代表?这只是一个想法... – IbrarMumtaz 2010-08-03 13:21:27

+1

@IbrarMumtaz:不,这些不会改变现有的代表 - 他们会根据旧代表返回一个新代表。 – 2010-08-03 13:56:29

3

调用列表是内部委托代码,不能正常修改。你可能能够通过非常肮脏的反射来做到这一点,但我不认为这是生产代码的有效主意。但有另一种方法可以有效地解决它。您可以定义event而无需自动托管代理,并自行控制调用列表。为此,您需要使用明确的addremove关键字定义事件,请参阅here。你将不得不重新实现一些东西,但它会给你完全的控制。

相关问题