c# - 如何在运行时操作委托(delegate)的调用列表?

标签 c# winforms reflection delegates

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

<DelegateName>.RemoveAll();

现在我可以删除所有的代理,这只是为了让想法付诸实现,看看它是否有效,但是删除的任何委托(delegate)都需要在运行时再次添加!!!

所以:...

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

现在我可以访问“D”,我可以将它放入 .Remove() 但它需要两个参数???请问我可以得到一些帮助吗?

最后,删除代理后,重新添加代理的最佳方式是什么? 所以我假设 Reflection 可能会在其中发挥作用,但交给你们了。

更新:

本质上有一个全局委托(delegate),它有许多事件存在于不同的 winforms 类中,这些类是它的实例。所有这些事件都有一个处理程序,用于在触发事件时处理该事件。一直位于顶部的委托(delegate)管理所有匹配其签名的处理程序被触发。我想在顶部弄乱这个委托(delegate),我想删除所有处理程序,然后在运行时重新添加它们。因此,顶部的委托(delegate)是一个多播委托(delegate),它的调用列表是单个委托(delegate)的列表,这些委托(delegate)依次指向我添加的四个处理程序之一。我希望这是有道理的,这是我在做什么的一般想法。

最佳答案

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

关于c# - 如何在运行时操作委托(delegate)的调用列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3396692/

相关文章:

c# - 为什么鼠标右键单击时拖放不起作用?

c# - 使用 Windows 窗体移植旧的 Flash 游戏 - 如何嵌入 Flash Player dll?

java - 如何以反射方式遍历数组字段?

c# - 可移植类库和反射

java - Reflection API 中 new Class[0] 的含义

c# - 检查 foreach 中的最后一个元素

c# - Linq 从 Dictionary 值匹配中返回WhereEnumerableIterator?

c# - 如何配置两个JSON序列化器并根据路由选择正确的一个

javascript - ES7 中新的 async 和 await 关键字是从 C# 复制过来的吗?

c# - Graphics.DrawString - 组合变音符的绘制不正确