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

Bru*_*oLM 1 .net c# reflection

我有一个活动 Load

public delegate void OnLoad(int i);
public event OnLoad Load;
Run Code Online (Sandbox Code Playgroud)

我订阅了一个方法:

public void Go()
{
    Load += (x) => { };
}
Run Code Online (Sandbox Code Playgroud)

是否可以使用反射检索此方法?怎么样?

Jon*_*eet 8

这个特殊情况下你可以用反射.但是,一般情况下,你不能.事件封装了订阅者订阅和取消订阅的想法 - 这就是全部.订户并不意味着找出其他订户.

一个现场般的事件,因为只显示已经可以简单地通过相关的委托类型的字段,用自动生成添加支持/删除刚刚使用字段处理程序.但是,没有什么可说的,他们必须像那样实施.例如,一个事件可以将其订阅者存储在一个中EventHandlerList,如果您在一个类中有多个事件并且只有少数事件可能被订阅,则这是有效的.

现在我想你可以尝试找到"添加"处理程序的主体,对其进行反编译并找出事件处理程序的存储方式,并以这种方式获取它们......但请不要.你正在创造很多工作,只是为了打破封装.只需重新设计代码,这样就不需要这样做了.

编辑:我已经假设你在谈论从获取用户以外的类声明事件.如果你是里面的类声明事件,则很容易,因为你知道是如何被存储的情况下.

此时,问题从"获取事件的订阅者"到"获取构成多播委托的各个代表" - 这很容易.正如其他人所说,您可以调用Delegate.GetInvocationList获取一组委托......然后使用该Delegate.Method属性来获取该特定委托所针对的方法.

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

public void Go()
{
    Load += (x) => { };
}
Run Code Online (Sandbox Code Playgroud)

这里用于创建委托Go的方法不是......它是由C#编译器创建的方法.它将有一个"无法形容的名称"(通常带有尖括号),所以看起来像这样:

[CompilerGenerated]
private static void <Go>b__0(int x)
{
}
Run Code Online (Sandbox Code Playgroud)

现在,这实际上是你要检索的吗?或者你真的想找出执行订阅的方法,而不是使用哪种方法作为订阅处理程序