gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:37 25 4
gpt4 key购买 nike

我有一个事件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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com