Как получить частные поля класса и его родительский класс путем отражения?

У меня есть класс B и его родительский класс A, как в пространстве имен Domain.

  • Класс A имеет частное поле a;
  • Класс B имеет частное поле b;

Тогда у меня есть Reflection Util в пространстве имен Reflect. Если я использую эту строку

instanceOfB.GetType().GetFields(BindingFlags.NonPublic 
         | BindingFlags.Public | BindingFlags.Instance );

чтобы найти все поля (a и b), я получаю только b. Но когда я делаю a protected или public, я нахожу их тоже.

Что мне нужно сделать, чтобы найти частные поля базового класса?

Ответ 1

Это документальное поведение:

Укажите BindingFlags.NonPublic, чтобы включить в поиск непубличные поля (то есть частные, внутренние и защищенные поля). Возвращаются только защищенные и внутренние поля базовых классов; частные поля в базовых классах не возвращаются.

Если вам нужно получить частные поля, вам нужно задать базовый тип. (Используйте Type.BaseType, чтобы найти базовый тип, и вызовите GetFields на этом.)

Ответ 2

instanceOfB.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance );

Ответ 3

 public class A
 {
     private int aa;
 }

 public class B
 {
     private int bb;
 }

System.Reflection.FieldInfo[] fields = (new B()).GetType().GetFields(BindingFlags.NonPublic| BindingFlags.Public | BindingFlags.Instance);