Поиск всех слушателей данного объекта - PullRequest
3 голосов
/ 17 ноября 2010

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

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

РЕДАКТИРОВАТЬ: Кажется, я был не прав. Этот код работает независимо от синтаксиса 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

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

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

0 голосов
/ 17 ноября 2010

Понял - мой плохой.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...