Как получить fieldInfo для члена Friend WithEvents?

У меня есть следующий член, определенный в форме 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, которые необходимо использовать для получения FieldInfo члена с модификатором Friend WithEvents?

1 ответ

Решение

Да, это не может работать как написано. Компилятор VB предоставляет члену WithEvents специальную обработку для реализации его функции. После того, как это сделано, ваша переменная myTab больше не является полем. Что-то, что вы можете увидеть, глядя на сгенерированную сборку с ildasm.exe полезность. Вот увидишь:

  • myTab теперь является свойством с геттером и сеттером. Вам нужно использовать 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)

Вероятно, первый.

Другие вопросы по тегам