2011-05-06 26 views
11

Tengo la clase B y su clase principal A, ambas en el dominio del espacio de nombres.¿Cómo obtener los campos privados de clase y su (s) clase (s) primaria (s) por reflexión?

  • La clase A, tiene el campo privado a;
  • Clase B, tiene el campo privado b;

Luego tengo un Reflection Util en el espacio de nombres Reflect. Si utilizo esta línea

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

a encontrar todos los campos (un & b), sólo obtengo b. Pero cuando hago a protegido o público, también los encuentro.

¿Qué debo hacer para encontrar los campos privados de la clase base también?

Respuesta

13

Este es el documented behaviour:

Especificar BindingFlags.NonPublic para incluir campos no públicas (es decir, campos y protegidas privadas, internas) en la búsqueda. Solo se devuelven los campos protegidos e internos en las clases base; los campos privados en las clases base no se devuelven.

Si necesita obtener campos privados, deberá preguntar el tipo de base. (Use Type.BaseType para encontrar el tipo de base, y llamar a GetFields en eso.)

+0

Permítame que pedir un poco más: Cuando voy recursiva throug la jerarquía de clases, ¿cómo me aseguro, que Obtengo todos los campos (incluso los campos públicos del padre) solo una vez? – Ralph

+1

@Ralph: puede usar 'BindingFlags.DeclaredOnly' para * evitar * obtener campos heredados de clases base. –

+0

Jon Skeet: Muchas gracias – Ralph

1
instanceOfB.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 
-4
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); 
+0

Él ya está incluyendo esos valores, según la pregunta. –

+0

Sir Funciona bien en mi extremo, siguiendo la línea de código anterior. Muestra la variable privada. – Pankaj

+0

Las variables privadas de la clase * base *? No debería. –

Cuestiones relacionadas