如何获取Friend WithEvents成员的fieldInfo?

时间:2015-01-15 14:10:28

标签: vb.net reflection friend fieldinfo

我在vb.net表单中定义了以下成员,MyForm:

Friend WithEvents myTab As Tab

我正在尝试使用以下代码获取此成员:

Dim FieldInfo As System.Reflection.FieldInfo = MyForm.GetType.GetField("myTab", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)

,但我总是得到任何回报。如果我尝试:

Dim MemberInfo As System.Reflection.MemberInfo = MyForm.GetType.GetMember("myTab", Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)(0)

,我确实得到了会员,但我无法获得它的价值。

是否需要使用其他BindingFlags来获取具有Friend WithEvents修饰符的成员的FieldInfo?

1 个答案:

答案 0 :(得分:1)

是的,这不能像书面说的那样工作。 VB编译器为 WithEvents 成员提供特殊处理以实现其功能。完成后, myTab 变量不再是一个字段。使用ildasm.exe实用程序查看生成的程序集时可以看到的内容。你会看到:

  • myTab现在是一个带有getter和setter的属性。您需要使用GetProperty()而不是GetField()来检索它。
  • 该属性有一个支持变量,用于存储对象引用,其名称为_myTab。请注意前导下划线。

不确定您真正想要去哪个方向,如果您想修改事件,则需要该属性。所以它是你需要的其中一个:

Dim info = MyForm.GetType().GetField("_myTab", _
               BindingFlags.Instance Or BindingFlags.NonPublic)

或者

Dim info = myForm.GetType().GetProperty("myTab", _
               BindingFlags.Instance Or BindingFlags.NonPublic)

可能是第一个。