如何在运行时操作Delegate的调用列表?

时间:2010-08-03 13:02:45

标签: c# winforms reflection delegates

我想知道如何从父代理的调用列表中删除单个代理。

<DelegateName>.RemoveAll();

现在我可以删除所有内容,只是为了让想法得到启发,看看它是否应该有效,但是删除的任何代表都需要在RunTime再次添加!!!

所以:......

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

既然我可以访问'D',我可以将它放入.Remove()但它需要两个参数???我能得到一些帮助吗?

最后,一旦删除了委托,再次重新添加委托的最佳方法是什么? 所以我假设反思可能在这方面发挥作用,但对你们来说。

更新:

基本上,有一个全局委托,其中有许多事件存在于不同的winforms类中,这些类是它的实例。所有这些事件都有一个处理事件的处理程序。一直在顶部的委托管理与其签名匹配的所有处理程序。我想在顶部搞乱这个委托,我想删除所有处理程序,然后在运行时重新添加它们。因此,顶部的委托是一个多播委托,其调用列表是各个委托的列表,而这些委托又指向我添加的四个处理程序之一。我希望这是有道理的,这是我正在做的一般概念。

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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