Отслеживание всех событий в VB.NET - PullRequest
1 голос
/ 10 мая 2010

Я продолжаю сталкиваться с ситуациями, когда не знаю, какое событие мне нужно прослушать, чтобы выполнить мой код в нужное время. Есть ли способ получить журнал всех событий, которые подняты? Есть ли способ отфильтровать этот журнал на основе того, какой объект вызвал событие?

РЕДАКТИРОВАТЬ: окончательное решение:

Private Sub WireAllEvents(ByVal obj As Object)
    Dim parameterTypes() As Type = {GetType(System.Object), GetType(System.EventArgs)}
    Dim Events = obj.GetType().GetEvents()
    For Each ev In Events
        Dim handler As New DynamicMethod("", Nothing, parameterTypes, GetType(main))
        Dim ilgen As ILGenerator = handler.GetILGenerator()
        ilgen.EmitWriteLine("Event Name: " + ev.Name)
        ilgen.Emit(OpCodes.Ret)
        ev.AddEventHandler(obj, handler.CreateDelegate(ev.EventHandlerType))
    Next
End Sub

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

1 Ответ

6 голосов
/ 10 мая 2010

Единственный способ, которым я могу придумать, - это использовать Reflection для перечисления всех событий и подключения общего обработчика, который будет представлять собой PITA.

Проблема с событиями Framework? Если так, то Microsoft неплохо справляется с заданием порядка жизненного цикла / порядка вызовов.

Редактировать

Итак, вот процедура захвата глобального события:

Private Sub WireAllEvents(ByVal obj As Object)
    'Grab all of the events for the supplied object
    Dim Events = obj.GetType().GetEvents()
    'This points to the method that we want to invoke each time
    Dim HandlerMethod = Me.GetType().GetMethod("GlobalHandler")
    'Loop through all of the events
    For Each ev In Events
        'Wire in a handler for the event
        ev.AddEventHandler(obj, [Delegate].CreateDelegate(ev.EventHandlerType, Me, HandlerMethod))
    Next
End Sub
Public Sub GlobalHandler(ByVal sender As Object, ByVal e As EventArgs)
    'Probably want to do something more meaningful here than just tracing
    Trace.WriteLine(e)
End Sub

Чтобы подключить его, просто позвоните WireAllEvents(Me.DataGridView1), предоставив ваш объект. Почти все события MS используют формат sender / e (включая DataGridView), но если по какой-то причине это не так, я думаю, что этот код выдаст ошибку. Но я только что протестировал его с DataGridView и Form, и он работал как положено.

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