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