2010-11-17 2 views
3

У меня есть объект (myObject), и я пытаюсь найти все, что слушает любое событие этого объекта.Поиск всех слушателей заданного объекта

Следующий код работает как ожидалось для слушателей, созданных с помощью синтаксиса AddHandler; но не сообщает слушателям, созданным с использованием синтаксиса «Ручки».

EDIT: Кажется, я был некорректен. Этот код действительно работает независимо от синтаксиса AddHandler/Handles; но он работает только для пользовательских событий объекта. Если myObject является элементом управления - я никогда не вижу обработчики событий Load(); но я увижу обработчиков для «MyCustomEvent».

Может ли кто-нибудь сказать мне, что мне нужно сделать, чтобы получить эти события?

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 
+0

Это также должно обрабатывать случай «Ручки», так как это просто синтаксический сахар для «AddHandler». Возможно, вы еще не создали объект класса с соответствующими предложениями 'Handles'? – cdhowie

ответ

1

Используя базовые типы, вы получите все события, но только те, которые фактически используют личное поле поддержки, содержащее делегат, с помощью методов прослушивания. Если они этого не делают (подумайте, например, о маршрутизированных событиях WPF), я думаю, вам не повезло: поскольку custom events может иметь произвольную реализацию AddHandler, RemoveHandler и RaiseEvent, я не думаю, что есть общий способ получить список методов прослушивания (потому что не может быть такого списка).

0

Получил это - мой плохой.

Все, что мне нужно было сделать, это вызвать тот же самый элемент с базовым типом объекта.

Смежные вопросы