2011-07-30 22 views
0

是否可以確定使用VB.NET某個事件是否附加了處理程序?我不擁有這個事件,在這種特殊情況下,我想知道Windows.Forms.MenuStrip中的哪些項目處理了他們的ToolstripMenuItem.Click事件。是否有事件X的處理程序?

+0

http://stackoverflow.com/questions/2952557/is-there-a-way-to-know-in-vb-net-if-a-handler-has-been-registered-for-an-event/2953318#2953318 – Stefan

+1

* Event *關鍵字的全部內容是爲了使這不可能。 Winforms有一個額外的保護層,所以即使有反射,它也幾乎是不可能的。請參閱http://stackoverflow.com/questions/293007/is-it-possible-to-steal-an-event-handler-from-one-control-and-give-it-to-anothe/293031#293031 –

回答

1

如果不創建自己的事件結構,或者可能使用反射來獲得私有編譯器實現的成員,我不認爲這是可能的。

我剛剛編譯了一小段代碼,並通過Reflector運行它。

原始代碼

 RemoveHandler d.CollectionChanged, AddressOf DestinationsChanged 
     AddHandler d.CollectionChanged, AddressOf DestinationsChanged 

什麼結束了在反射器.NET的出現使一些使用編譯器生成的觀察集合的跟蹤事件

 Me.$STATIC$get_Destinations$200126C$d.remove_CollectionChanged(New NotifyCollectionChangedEventHandler(Me, DirectCast(Me.DestinationsChanged, IntPtr))) 
    Me.$STATIC$get_Destinations$200126C$d.add_CollectionChanged(New NotifyCollectionChangedEventHandler(Me, DirectCast(Me.DestinationsChanged, IntPtr))) 

通知。

您+可能+能夠使用反射到達類並檢索這些內部定義的集合,然後枚舉它們的內容,但我從來沒有嘗試過。

另一種選擇可能是爲相關事件滾動您自己的事件處理結構。

查看這篇文章瞭解更多。

http://www.codeproject.com/KB/cs/EventChain.aspx

爲了進一步調查,我會強烈建議抓住反射器的副本。

相關問題