2010-07-19 160 views
4

在VB.NET中可以輕鬆編寫一個事件處理程序來處理每個觸發的事件嗎?我想知道是否可以使用這樣的東西來製作日誌記錄系統。在一個處理程序中處理所有事件?

我想這樣做(在僞代碼):

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

我意識到這將是緩慢的,但它不會是一個生產系統,只作爲開發工具。

+0

你能提供一個你想要做什麼的代碼示例嗎? – Oded 2010-07-19 18:55:11

+3

如果你在VB中處理每個事件,你將會讓系統變慢。例如,WM_PAINT每秒激發數千次。 – 2010-07-19 18:55:18

+0

我甚至不確定它是否可行,但在性能無關緊要時,它可能對調試有用。 – davidscolgan 2010-07-19 18:56:45

回答

4

你可以用reflection來做到這一點。就是這樣。使用名爲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 

這是來自Francesco Balena的書Programming Microsoft Visual Basic 2005 The Language。技術與任何引發事件的對象協作,而不僅僅是控制。它使用contravariance

如果您buy the book,有一個完整的解釋和一些更多的代碼,這將允許您確定在通用處理程序中觸發了哪個事件,並使用正則表達式來處理事件的一個子集。我不覺得我可以在這裏張貼這麼長的摘錄。

3

編輯:由於漢斯的評論調整。

沒問題,至少對於某些事件,因爲它已經內置於發送消息的事件。只要看看Control.WndProc。所有到窗口的消息都會通過那裏。

+0

+1點。但是,對於任何子控件,您必須將它們繼承,然後使用子版本。例如,公共類MyTextBox /繼承文本框/覆蓋WndProc(代碼...)/結束類。 CALL A WORKER SUB不要把代碼放在WndProcs中。將它傳遞給Message和control.name。基於你關心的內容過濾消息;大多數,你會通過。 – FastAl 2010-07-19 19:44:08

+0

不是。許多事件沒有與之關聯的Window消息。 AutoSizeChanged,BackColorChanged,BindingContextChanged等等,但它的實用性與它相同。 – 2010-07-19 19:45:16

+0

顯然這隻涵蓋控件而不是*所有*事件。 – 2010-07-19 20:26:42