2010-05-10 47 views
0

我不知道爲了在正確的時間執行我的代碼,我不知道要收聽哪些事件。有什麼辦法可以記錄所有引發的事件嗎?根據什麼對象引發事件來過濾日誌的任何方法?在VB.NET中跟蹤所有事件

編輯:最終的解決方案:

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事件方法有很好的理由,但在試圖找出要添加處理程序的方法時,這仍然很有用。

回答

5

我能想到的唯一方法是使用Reflection來枚舉所有的事件並連接一個通用的處理程序,它將是一個PITA。

框架事件是否存在問題?如果是這樣,微軟在提供事件生命週期/呼叫訂單方面做得相當不錯。

編輯

因此,這裏是一個全球性的事件捕獲例程:

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來測試它,並且它按預期工作。

+0

是的,這是關於框架事件。例如一個DataGridView有大量不同的事件。他們中的一些人有非常明顯的觸發器,但同樣的動作往往會觸發許多事件,有些人的名字不像自我解釋。如果我要執行一個動作並獲得它觸發的所有事件的列表,那麼找出我想要處理的事件會容易得多。如果我可以在每個事件中手動檢查數據庫/數據集,那更好。 – MatsT 2010-05-10 15:04:06

+0

這似乎是做我想做的,除了我還沒有弄清楚如何獲取實際事件的名稱而不是EventArgs的類型。 – MatsT 2010-05-11 13:26:54

+0

我嘗試干擾代理委託到接受ev.Name的AddEventHandler方法,但我無法弄清楚語法。我切換到VB10並嘗試使用匿名委託,但不會運行。 – 2010-05-11 14:25:44