我有一个简单的方法
Public Sub mysub(sender As Object, e As EventArgs)
... here i need somehow the name of the event which has been raised
End sub
我后来跟其吻合:
dyn_method = GetType(DynamicCtrlFunctions).GetMethod("mysub")
dynamicEventInfo = CTRID_Object.GetType.GetEvent("leave")
Dim eventdelegate As [Delegate]= [Delegate].CreateDelegate(dynamicEventInfo.EventHandlerType, Nothing, dyn_method)
dynamicEventInfo.AddEventHandler(myObject, eventdelegate)
如何将system.eventhandle的绑定过程中的事件名称以某种方式传递给mysub,以便在事件调用时可以在mysub中获取事件名称?
答案 0 :(得分:1)
这需要一些严肃的重构,但我让它发挥作用。
它使用匿名方法作为事件的直接事件处理程序。该方法捕获事件的名称和真实的处理程序,并将它们传递给另一个代理事件处理程序。该代理调用您的实际处理程序,传入捕获事件的名称。
i
答案 1 :(得分:0)
不幸的是,我无法想到良好的方式来做到这一点。
话虽这么说,你可以从你传递的Type
方法的EventArgs
推断事件名称。但这绝对不会在所有情况下都能奏效。
另一种选择是使用反射来检查调用堆栈。在.NET WinForms中,事件的常见约定是它们是从名为" On {EventName}"的方法引发的。因此,Click
事件是从OnClick
引发的。调用堆栈的前一帧,在事件处理程序中,应该具有该方法的名称。您可以解析该名称以确定事件名称。不能保证代码作者遵循该约定,或者某人没有从事件以外的某个地方手动调用您的处理程序。
我绝对不希望在任何性能关键代码中使用此方法。