c# - 如何检索事件的所有方法?

标签 c# .net reflection

我有一个事件Load

public delegate void OnLoad(int i);
public event OnLoad Load;

我用一种方法订阅它:
public void Go()
{
    Load += (x) => { };
}

是否可以使用反射检索此方法?如何?

最佳答案

在这种特殊情况下,您可以进行反射(reflection)。但是,一般情况下,您不能。事件封装了订阅者订阅和取消订阅的想法——仅此而已。订阅者并不意味着要找出其他订阅者。

您刚刚展示的类似字段的事件仅由相关委托(delegate)类型的字段支持,并带有仅使用该字段的自动生成的添加/删除处理程序。但是,没有什么可以说它们必须像那样实现。例如,一个事件可以将其订阅者存储在 EventHandlerList 中。 ,如果您在一个类中有多个事件并且可能只订阅其中的几个事件,这将是有效的。

现在我想你可以尝试找到“add”处理程序的主体,反编译它并计算出事件处理程序是如何存储的,然后以这种方式获取它们......但请不要。您正在创建大量工作,只是为了打破封装。只需重新设计您的代码,这样您就不需要这样做了。

编辑:我一直在假设您正在谈论让来自类外的订阅者宣布该事件。如果您在声明事件的类中,那么这很容易,因为您知道事件是如何存储的。

到那时,问题就从“获取事件的订阅者”变成了“获取组成多播委托(delegate)的各个代表”——这很容易。正如其他人所说,您可以调用 Delegate.GetInvocationList 获取代表数组...然后使用 Delegate.Method 属性以获取该特定委托(delegate)所针对的方法。

现在,让我们再看看您的订阅代码:

public void Go()
{
    Load += (x) => { };
}

此处用于创建委托(delegate)的方法不是 Go ...它是由 C# 编译器创建的方法。它将有一个“难以形容的名字”(通常带有尖括号),所以看起来像这样:
[CompilerGenerated]
private static void <Go>b__0(int x)
{
}

现在,这实际上是您想要检索的吗?还是您真的想找出执行订阅的方法,而不是用作订阅处理程序的方法?

关于c# - 如何检索事件的所有方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3781963/

相关文章:

json - 动态创建某种类型的结构并将 JSON 解码到该实例中

java - 注释属性 Test.enabled 的值必须是常量表达式

C# 句柄数

c# - Container.DataItemIndex 在 gridview 中不起作用

.net - 如何在我的 .NET 应用程序中托管 HTML5?

java - 如何使用反射获取对象字段的对象引用?

c# - 如何在具有透明度和文本的图像上绘制矩形

c# - 定期更换桌面墙纸

c# - 如何使用 C# 在 Active Directory 中获取组所属的组?

c# - 使用反射时如何调用方法?