我有一个对象(myObject),并且试图查找正在侦听该对象任何事件的所有内容。
以下代码对于使用AddHandler语法创建的侦听器似乎可以正常工作;但不会报告使用“句柄”语法创建的侦听器。
编辑:看来我不正确。不管AddHandler / Handles语法如何,此代码都可以工作。但它似乎仅适用于对象的自定义事件。如果myObject是控件-我从不会看到Load()事件处理程序;但我会看到“MyCustomEvent”的处理程序。
谁能告诉我要完成这些 Activity 我需要做什么?
Public Sub GetListeners(ByVal myObject As Object)
Dim myType As Type = myObject.GetType
Dim myFieldList As FieldInfo() = myType.GetFields(BindingFlags.Static Or BindingFlags.Instance Or BindingFlags.NonPublic)
For Each myInfo In myFieldList
Dim myDelegate As [Delegate] = TryCast(myInfo.GetValue(myObject), [Delegate])
If myDelegate IsNot Nothing Then
For Each myItem In myDelegate.GetInvocationList
System.Diagnostics.Debug.WriteLine(myDelegate.GetInvocationList(0).Method.Name & "-->" & myDelegate.GetInvocationList(0).Method.DeclaringType.FullName)
Next
End If
Try
Dim eventList As EventHandlerList = DirectCast(myObject.GetType().GetProperty("Events", _
(BindingFlags.FlattenHierarchy Or (BindingFlags.NonPublic Or BindingFlags.Instance))).GetValue(myObject, Nothing), EventHandlerList)
myDelegate = eventList(myInfo.GetValue(myObject))
Catch ex As Exception
End Try
If myDelegate IsNot Nothing Then
For Each myItem In myDelegate.GetInvocationList
System.Diagnostics.Debug.WriteLine(myDelegate.GetInvocationList(0).Method.Name & "-->" & myDelegate.GetInvocationList(0).Method.DeclaringType.FullName)
Next
End If
Next
End Sub
最佳答案
使用基本类型,您将获得所有事件,但只有那些实际上使用包含委托(delegate)和侦听方法的 private 后备字段的事件。如果他们不这样做(例如考虑WPF的路由事件),我认为您很不走运:由于custom events可以具有AddHandler,RemoveHandler和RaiseEvent的任意实现,所以我认为没有获取侦听方法列表的通用方法(因为可能没有这样的列表)。