在VB.NET中可以輕鬆編寫一個事件處理程序來處理每個觸發的事件嗎?我想知道是否可以使用這樣的東西來製作日誌記錄系統。在一個處理程序中處理所有事件?
我想這樣做(在僞代碼):
Public Sub eventHandledEvent(ByVal sender As Object, ByVal e As EventArgs)
File.Write(sender.EventName)
End Sub
我意識到這將是緩慢的,但它不會是一個生產系統,只作爲開發工具。
在VB.NET中可以輕鬆編寫一個事件處理程序來處理每個觸發的事件嗎?我想知道是否可以使用這樣的東西來製作日誌記錄系統。在一個處理程序中處理所有事件?
我想這樣做(在僞代碼):
Public Sub eventHandledEvent(ByVal sender As Object, ByVal e As EventArgs)
File.Write(sender.EventName)
End Sub
我意識到這將是緩慢的,但它不會是一個生產系統,只作爲開發工具。
你可以用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,有一個完整的解釋和一些更多的代碼,這將允許您確定在通用處理程序中觸發了哪個事件,並使用正則表達式來處理事件的一個子集。我不覺得我可以在這裏張貼這麼長的摘錄。
編輯:由於漢斯的評論調整。
沒問題,至少對於某些事件,因爲它已經內置於發送消息的事件。只要看看Control.WndProc。所有到窗口的消息都會通過那裏。
+1點。但是,對於任何子控件,您必須將它們繼承,然後使用子版本。例如,公共類MyTextBox /繼承文本框/覆蓋WndProc(代碼...)/結束類。 CALL A WORKER SUB不要把代碼放在WndProcs中。將它傳遞給Message和control.name。基於你關心的內容過濾消息;大多數,你會通過。 – FastAl 2010-07-19 19:44:08
不是。許多事件沒有與之關聯的Window消息。 AutoSizeChanged,BackColorChanged,BindingContextChanged等等,但它的實用性與它相同。 – 2010-07-19 19:45:16
顯然這隻涵蓋控件而不是*所有*事件。 – 2010-07-19 20:26:42
你能提供一個你想要做什麼的代碼示例嗎? – Oded 2010-07-19 18:55:11
如果你在VB中處理每個事件,你將會讓系統變慢。例如,WM_PAINT每秒激發數千次。 – 2010-07-19 18:55:18
我甚至不確定它是否可行,但在性能無關緊要時,它可能對調試有用。 – davidscolgan 2010-07-19 18:56:45