Обрабатывать ВСЕ события в одном обработчике? - PullRequest
5 голосов
/ 19 июля 2010

Возможно ли в VB.NET легко написать обработчик событий, который будет обрабатывать каждое событие, которое вызывается? Мне интересно, можно ли создать систему журналирования, используя что-то вроде этого.

Я хочу сделать что-то вроде (в псевдокоде):

Public Sub eventHandledEvent(ByVal sender As Object, ByVal e As EventArgs)
    File.Write(sender.EventName)
End Sub

Я понимаю, что это будет медленно, но не для производственной системы, а только как инструмент разработки.

Ответы [ 2 ]

5 голосов
/ 21 июля 2010

Вы можете сделать это с отражением . Вот как. Создайте форму с текстовым полем с именем TextBox1. Вставьте следующий код. Запустите проект и посмотрите на ближайшее окно.

Public Class Form1

  Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    RegisterAllEvents(TextBox1, "MyEventHandler")
  End Sub

  Sub MyEventHandler(ByVal sender As Object, ByVal e As EventArgs)
    Debug.WriteLine("An event has fired: sender= " & sender.ToString & ", e=" & e.ToString)
  End Sub
  Sub RegisterAllEvents(ByVal obj As Object, ByVal methodName As String)
    'List all events through reflection'
    For Each ei As System.Reflection.EventInfo In obj.GetType().GetEvents()
      Dim handlerType As Type = ei.EventHandlerType
      Dim method As System.Reflection.MethodInfo = Me.GetType().GetMethod(methodName)
      'Create a delegate pointing to the method'
      Dim handler As [Delegate] = [Delegate].CreateDelegate(handlerType, Me, method)
      'Register the event through reflection'
      ei.AddEventHandler(obj, handler)
    Next
  End Sub
End Class

Это из книги Франческо Балены Программирование на языке Microsoft Visual Basic 2005 The Language . Техника работает с любым объектом, который вызывает события, а не только с элементами управления. Используется контравариантность .

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

3 голосов
/ 19 июля 2010

Редактировать: корректируется с учетом комментария Ганса.

Нет проблем, по крайней мере для некоторых событий, так как он уже встроен для событий, отправляющих сообщения. Просто посмотрите на Control.WndProc . Все сообщения в окно будут проходить там.

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