vb.net使用后期绑定将eventname传递给方法

时间:2016-12-23 15:50:57

标签: vb.net

我有一个简单的方法

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中获取事件名称?

2 个答案:

答案 0 :(得分:1)

这需要一些严肃的重构,但我让它发挥作用。

它使用匿名方法作为事件的直接事件处理程序。该方法捕获事件的名称和真实的处理程序,并将它们传递给另一个代理事件处理程序。该代理调用您的实际处理程序,传入捕获事件的名称。

i

答案 1 :(得分:0)

不幸的是,我无法想到良好的方式来做到这一点。

话虽这么说,你可以从你传递的Type方法的EventArgs推断事件名称。但这绝对不会在所有情况下都能奏效。

另一种选择是使用反射来检查调用堆栈。在.NET WinForms中,事件的常见约定是它们是从名为" On {EventName}"的方法引发的。因此,Click事件是从OnClick引发的。调用堆栈的前一帧,在事件处理程序中,应该具有该方法的名称。您可以解析该名称以确定事件名称。不能保证代码作者遵循该约定,或者某人没有从事件以外的某个地方手动调用您的处理程序。

您可以在下图中按钮的Click事件内看到调用堆栈的示例。 enter image description here

我绝对不希望在任何性能关键代码中使用此方法。