2010-05-10 46 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