【问题标题】:Tracing all events in VB.NET跟踪 VB.NET 中的所有事件
【发布时间】:2010-05-10 13:05:38
【问题描述】:

我经常遇到这样的情况:我不知道必须听什么事件才能在正确的时间执行我的代码。有没有办法获取所有引发的事件的日志?有什么方法可以根据引发事件的对象过滤该日志?

编辑:最终解决方案:

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 事件方法有充分的理由,但在尝试确定要将处理程序添加到哪个方法时,这仍然很有用。

【问题讨论】:

  • 这太棒了。谢谢。

标签: vb.net reflection


【解决方案1】:

我能想到的唯一方法是使用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 对其进行了测试,它按预期工作。

【讨论】:

  • 是的,它与框架事件有关。例如,DataGridView 有大量不同的事件。其中一些具有非常明显的触发因素,但相同的操作通常会触发许多事件,而一些事件的名称则无法自我解释。如果我要执行一个操作并获取它触发的所有事件的列表,那么找出我想要处理的事件会容易得多。如果我可以中断每个事件以手动检查数据库/数据集,那就更好了。
  • 这似乎符合我的要求,只是我还没有弄清楚如何获取实际事件的名称而不是 EventArgs 的类型。
  • 我尝试将代理委托插入接受 ev.Name 的 AddEventHandler 方法,但我无法弄清楚语法。我切换到 VB10 并尝试使用匿名委托,但它无法运行。
  • 看看这篇博文,他有一些事件监控代码:gojisoft.com/blog/2010/04/22/event-sequence-unit-testing-part-1
  • 使用msdn.microsoft.com/en-us/library/ms228976.aspx 的非常广泛的指南,我能够弄清楚。使用反射和动态方法,我可以打印自定义消息。有关代码,请参阅原始问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
相关资源
最近更新 更多