語句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
我敢肯定,你可以夾具周圍代碼如果你想返回代表而不是方法信息等。
我希望這可以幫助。
從你前面的問題的最高投票的回答引用:「現在我想你可以嘗試找到的身體‘加’處理,反編譯,並制定出如何的事件處理程序正在存儲並以這種方式獲取它們...... **但是請不要**。您正在創建大量工作,只是爲了打破封裝,只是**重新設計代碼**,以便您不需要做這個。」我完全同意。 – 2010-09-24 00:39:32