是否有事件X的处理程序?

时间:2011-07-30 11:57:00

标签: vb.net event-handling

是否可以使用VB.NET确定某个事件是否附加了任何处理程序?我不拥有该事件,在这种特殊情况下,我想知道Windows.Forms.MenuStrip中的哪些项目处理了ToolstripMenuItem.Click事件。

1 个答案:

答案 0 :(得分:1)

如果不创建自己的事件结构,或者可能使用反射来获取私有编译器实现的成员,我认为这是不可能的。

我刚刚编译了一个小片段并通过Reflector运行它。

原始代码

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

最终出现在反射器中的是什么

     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)))

请注意,.net似乎使用了一些编译器生成的可观察集合来跟踪事件。

你+可能+能够使用反射进入类并检索那些内部定义的集合,然后枚举它们的内容,但我从未尝试过。

另一种选择可能是为相关事件推送自己的事件处理结构。

查看此文章了解更多信息。

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

为了进一步调查,我强烈建议您抓一份Reflector。