Soy un absoluto novato en la reflexión en C#. Quiero usar la reflexión para tener acceso a todos los campos privados de una clase, incluyendo aquellos que son hereditarias.

He logrado acceder a todos los campos privados excluyendo aquellos que son heredadas, así como a todos los públicos y protegidos de los campos heredados. Sin embargo, no he sido capaz de acceder a la privada, los campos heredados. El siguiente ejemplo 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();
    }
}

Este no puede encontrar el campo de B. a.

Siquiera es posible lograr esto? La solución obvia sería convertir el privado, de los campos heredados de campos protegidos. Esto, sin embargo, está fuera de mi control en el momento.

InformationsquelleAutor Odrade | 2009-03-26

4 Comentarios

  1. 14

    Como Lee dijo, usted puede hacer esto con la recursividad.

    private static void FindFields(ICollection<FieldInfo> 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<FieldInfo>();
        FindFields(fields, typeof(B));
        foreach (FieldInfo fi in fields)
            Console.WriteLine(fi.DeclaringType.Name + " - " + fi.Name);
    }
    • En lugar de la cláusula «si» para ignorar los campos heredados, se podría especificar BindingFlags.DeclaredOnly.
    • con el uso de BaseType en un Tipo, podemos acceder a la Base de la clase de miembro privado. No, esto no es la solución de cualquier mundo real problema para mí, pero yo estoy solo por curiosidad, porque el uso de BaseType propiedad de Tipo clase estoy convencido de que (mientras escribo esto) yo soy el acceso del Niño miembros de clase base, así que es allí cualquier manera de los demás con el uso de BaseType propiedad para lograr el mismo?
  2. 4

    Yo no lo he probado, pero usted debería ser capaz de acceder a la base el tipo de miembros privados a través de la Tipo.BaseType de la propiedad y de forma recursiva se acumulan todos los campos privados a través de la inheritence jerarquía.

  3. 0

    No puede acceder a los campos privados de A utilizando el tipo de B porque los campos no existen en B – que sólo existen en A. Deberá especificar el tipo de A directamente, o recuperar a través de otros medios (como la adquisición de la clase base desde el tipo de B).

    • La basura, por supuesto que existen en B. Si no estaban en la B, ¿cómo podría un método heredado de Una que tiene acceso a un privado el trabajo de campo?
    • La instancia de B puede tener Una privada de miembros, pero el Tipo de B no tiene conocimiento de tales miembros.
  4. -1

    Puede acceder a los miembros privados de la Clase a, de Clase B con ‘Clases Anidadas’
    . Hacer de la Clase a como de Clase Exterior y de la Clase B como Clase Interna

    Class A
    {
     ...
     Class B
     {
    .......
      }
    
    }
    • Yo no soy capaz de modificar las clases. Sólo estoy tratando de reunir información sobre ellos a través de la reflexión.

Dejar respuesta

Please enter your comment!
Please enter your name here