代码之家  ›  专栏  ›  技术社区  ›  MatsT

跟踪vb.net中的所有事件

  •  1
  • MatsT  · 技术社区  · 16 年前

    我经常遇到这样的情况:我不知道为了在正确的时间执行代码,我必须听什么事件。是否有任何方法可以获取引发的所有事件的日志?有什么方法可以根据引发事件的对象筛选日志?

    编辑:最终解决方案:

    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 回复  |  直到 16 年前
        1
  •  6
  •   Chris Haas    16 年前

    我唯一能想到的方法就是 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测试了它,它工作正常。