GetField不适用于[按钮上的事件]按钮控件

时间:2014-10-27 10:56:32

标签: vb.net reflection

我有以下代码创建一个按钮:

    Dim B As New Button
    B.Parent = Me
    B.Location = New Point(50, 50)

    AddHandler B.Click, Sub()
                            MsgBox("Hi")
                        End Sub

    'I try to get the field info for the click event inorder to get the event handler and remove it
    Dim FieldInfo As FieldInfo = B.GetType.GetField("Click", BindingFlags.[Static] Or BindingFlags.NonPublic Or BindingFlags.Public)

    Dim obj As Object = FieldInfo.GetValue(Obj_)
    Dim EI As EventInfo = Obj_.GetType.GetEvent(EventName)
    EI.RemoveEventHandler(Obj_, obj)

但FieldInfo始终为null。我尝试了许多事件名称 ClickEvent,EventClick ... ,但没有一个允许我得到结果。

有人知道我的代码缺少什么吗?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

我建议你仔细阅读 - How to: Hook Up a Delegate Using Reflection

  

获取表示该事件的 EventInfo 对象,然后使用    EventHandlerType 属性,用于获取用于处理的委托类型   事件。在以下代码中,Click事件的EventInfo是   获得。

代码段:

   Dim evClick As EventInfo = tExForm.GetEvent("Click")
    Dim tDelegate As Type = evClick.EventHandlerType

您可以轻松获取其列表(type.GetEvents()),添加其他处理程序(EventInfo.AddEventHandler())或删除处理程序(EventInfo.RemoveEventHandler())。要获得附加代表的列表,您必须做更多的事情。

参考文献:
Removing Event Handlers using Reflection
How to get event handlers list using reflection
Raise an event via reflection in c#
Getting event via reflection

答案 1 :(得分:0)

您需要使用GetEvent()而不是GetField()。

请参阅http://msdn.microsoft.com/en-us/library/50943xt0(v=vs.110).aspx

Dim myEventInfo As EventInfo = B.GetType.GetEvent("Click", BindingFlags.[Static] Or BindingFlags.NonPublic Or BindingFlags.Public)

你也可以使用一般的GetMember方法,该方法返回一个(数组)MethodInfo,它是(FieldInfo,EventInfo)等的超类,它返回一个数组,因为可能存在多个匹配(即重载方法等)。 / p>