C #: Acessando membros de instância privada herdados por meio de reflection

Eu sou um principiante absoluto na reflection em c #. Eu quero usar a reflection para acessar todos os campos privados em uma class, incluindo aqueles que são herdados.

Consegui acessar todos os campos privados, exceto aqueles que são herdados, bem como todos os campos herdados públicos e protegidos. No entanto, não consegui acessar os campos herdados privados. O exemplo a seguir ilustra:

class A { private string a; public string c; protected string d; } class B : A { private string b; } class test { public static void Main(string[] Args) { B b = new B(); Type t; t = b.GetType(); FieldInfo[] fields = t.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); foreach(FieldInfo fi in fields){ Console.WriteLine(fi.Name); } Console.ReadLine(); } } 

Isso não consegue encontrar o campo Ba

É possível até conseguir isso? A solução óbvia seria converter os campos herdados privados em campos protegidos. Isso, no entanto, está fora do meu controle no momento.

Como Lee afirmou, você pode fazer isso com recursion.

 private static void FindFields(ICollection fields, Type t) { var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; foreach (var field in t.GetFields(flags)) { // Ignore inherited fields. if (field.DeclaringType == t) fields.Add(field); } var baseType = t.BaseType; if (baseType != null) FindFields(fields, baseType); } public static void Main() { var fields = new Collection(); FindFields(fields, typeof(B)); foreach (FieldInfo fi in fields) Console.WriteLine(fi.DeclaringType.Name + " - " + fi.Name); } 

Eu não tentei, mas você deve ser capaz de acessar os membros privados do tipo base por meio da propriedade Type.BaseType e recursivamente acumular todos os campos particulares por meio da hierarquia de inheritance.

Você não pode acessar os campos privados de A usando o tipo de B porque esses campos não existem em B – eles só existem em A Você precisa especificar o tipo de A diretamente ou recuperá-lo por outros meios (como obter a class base do tipo B ).

Você pode acessar membros privados da Classe A da Classe B com ‘Classes Aninhadas’. Você faz Classe A como Classe Externa e Classe B como Classe Interna

 Class A { ... Class B { ....... } }