我一直在遇到我不知道要听哪个事件以便在正确的时间执行我的代码的情况。有没有办法记录所有引发的事件?有什么方法可以根据引发事件的对象来过滤该日志吗?
编辑:最终解决方案:
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事件方法有充分的理由,但在尝试确定要添加处理程序的方法时,这仍然很有用。
答案 0 :(得分:6)
我能想到的唯一方法是使用Reflection来枚举所有事件并连接一个通用处理程序,它将是一个PITA。
Framework事件有问题吗?如果是这样,微软在提供事件生命周期/呼叫顺序方面做得非常好。
修改强>
所以这是一个全局事件捕获例程:
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测试它,它按预期工作。