gpt4 book ai didi

c# - 如何从 EventInfo 中获取委托(delegate)对象?

转载 作者:可可西里 更新时间:2023-11-01 08:59:51 24 4
gpt4 key购买 nike

我需要从当前类中获取所有事件,并找出订阅它的方法。 Here I got some answers on how to do that ,但是当我只有 EventInfo 时,我不知道如何获得 delegate

var events = GetType().GetEvents();

foreach (var e in events)
{
Delegate d = e./*GetDelegateFromThisEventInfo()*/;
var methods = d.GetInvocationList();
}

是否可以通过 EventInfo 获得委托(delegate)?怎么办?

最佳答案

语句 var events = GetType().GetEvents(); 为您提供与当前类型关联的 EventInfo 对象列表,而不是当前实例本身。所以 EventInfo 对象不包含有关当前实例的信息,因此它不知道连接的委托(delegate)。

要获取所需信息,您需要获取当前实例上事件处理程序的支持字段。方法如下:

public class MyClass
{
public event EventHandler MyEvent;

public IEnumerable<MethodInfo> GetSubscribedMethods()
{
Func<EventInfo, FieldInfo> ei2fi =
ei => this.GetType().GetField(ei.Name,
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.GetField);

return from eventInfo in this.GetType().GetEvents()
let eventFieldInfo = ei2fi(eventInfo)
let eventFieldValue =
(System.Delegate)eventFieldInfo.GetValue(this)
from subscribedDelegate in eventFieldValue.GetInvocationList()
select subscribedDelegate.Method;
}
}

所以现在您的调用代码可以如下所示:

class GetSubscribedMethodsExample
{
public static void Execute()
{
var instance = new MyClass();
instance.MyEvent += new EventHandler(MyHandler);
instance.MyEvent += (s, e) => { };

instance.GetSubscribedMethods()
.Run(h => Console.WriteLine(h.Name));
}

static void MyHandler(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}

上面的输出是:

MyHandler
<Execute>b__0

如果您希望返回委托(delegate)而不是方法信息等,我相信您可以修改代码。

希望对您有所帮助。

关于c# - 如何从 EventInfo 中获取委托(delegate)对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3783267/

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