Оператор var events = GetType().GetEvents();
возвращает список EventInfo
объектов, связанных с текущим типом, а не с текущим экземпляром как таковым. Таким образом, объект EventInfo
не содержит информации о текущем экземпляре и, следовательно, он не знает о подключенных делегатах.
Чтобы получить необходимую информацию, вам нужно получить поле поддержки для обработчика событий в вашем текущем экземпляре. Вот как:
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
Я уверен, что вы можете поиграться с кодом, если хотите вернуть делегат, а не информацию о методе и т. Д.
Надеюсь, это поможет.