2010-02-28 55 views
1

假設我有一個事件訂閱如發現委託方法註冊事件

_vm.PropertyChanged += OnViewModelAmountChanged; 

我怎麼能看到的反映,方法名,你可以看到它在調試程序的方式嗎?我得到儘可能低於前行,我決定我可能是在邊緣地區

?vm.GetType().GetEvent("PropertyChanged").EventHandlerType.GetMethod("GetInvocationList") 

有人可以讓我回到地球?這也可以通過表達式來完成嗎?

乾杯,
Berryl

+0

這是覆蓋在:http://stackoverflow.com/questions/1129517/c-how-to - 查找事件是否被連接 – 2010-02-28 05:22:10

回答

1

一個.NET事件是一個簡單的雙名爲add_Whateverremove_Whatever方法。他們不保證得到實地支持。

當您在C#中編寫event EventHandler Whatever;時,它將自動生成一個與該事件同名的專用字段,以及設置字段的addremove訪問器。

您可以在運行時通過使用Reflection獲取專用字段的值,然後調用Delegate類的公共GetInvocationList方法(無反射)來檢查這些。

對於非簡單事件,包括所有的WinForms事件,這種方法將不起作用。

+0

非常好的答案。我打算建議尋找編譯器生成的字段,但我完全忘記了Windows窗體控件使用的「事件字典」模式。我想知道爲什麼EventInfo有一個GetRaiseMethod?看起來似乎不可能提供一個。 – Josh 2010-02-28 05:16:35

+0

@Josh:http://blogs.msdn.com/thottams/archive/2006/03/18/554222.aspx – SLaks 2010-02-28 05:22:24

+0

你能否劃出反射位的一些代碼?我想你應該能夠使用「vm.GetType()。GetField(」PropertyChanged「,System.Reflection.BindingFlags.NonPublic)」找到一個字段,但返回null – Berryl 2010-02-28 05:34:46

1

要記住的一件事是事件可能會自定義事件的添加/刪除方法。在這種情況下,包含類可以將委託放入任何數據結構(例如List)或甚至忽略它(儘管這不太可能)。重要的一點是委託可以以類喜歡的任何方式存儲。這就像試圖找到用於存儲Property的值的字段。

0

如果您聲明該事件的類中,你可以做這樣的事情:

foreach(Delegate d in MyEvent.GetInvocationList()) 
{ 
    Console.WriteLine(d.Method.Name); 
} 
+0

我想從單元測試中獲得它 – Berryl 2010-02-28 05:39:11