我需要从当前类中获取所有事件,并找出订阅它的方法。 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/

10-16 08:52