2009-06-24 21 views
15

C#, Net 2.0¿Qué pasa con este código de reflexión? GetFields() devuelve un array vacío

Aquí está el código (saqué todas mis cosas de dominio específico, y se devolverá un conjunto vacío):

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Reflection; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ChildClass cc = new ChildClass(); 
      cc.OtherProperty = 1; 

      FieldInfo[] fi = cc.GetType().GetFields(); 
      Console.WriteLine(fi.Length); 
      Console.ReadLine(); 
     } 
    } 
    class BaseClass<T> 
    { 
     private int myVar; 

     public int MyProperty 
     { 
      get { return myVar; } 
      set { myVar = value; } 
     } 


    } 

    class ChildClass : BaseClass<ChildClass> 
    { 
     private int myVar; 

     public int OtherProperty 
     { 
      get { return myVar; } 
      set { myVar = value; } 
     } 

    } 
} 

Respuesta

53

El sin parámetros GetFields() devuelve public campos. Si desea que las no públicas, uso:

cc.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic); 

o cualquier combinación apropiada que usted quiere - pero hace necesario especificar al menos una de Instance y Static, de lo contrario no se encuentra bien. Puede especificar ambos, y también campos públicos, para obtener todo:

cc.GetType().GetFields(BindingFlags.Instance | 
         BindingFlags.Static | 
         BindingFlags.NonPublic | 
         BindingFlags.Public); 
+4

+1 Este es el que debe * especificar * Instance además de NonPublic. –

+1

¡Salud para la respuesta! Sin embargo, estoy teniendo problemas para entenderlo. ¿Podría alguien explicar por qué se requiere instancia o estática junto con NonPublic para campos privados? – Zack

+0

@ rory.ap: Sí, exactamente. –

10

Desde el campo es privado, debe usar la sobrecarga de GetFields() que le permite especificar BindingFlags.NonPublic.

Para que esto funcione, cambie a:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
5

Es necesario especificar que desea que los (no pública) campos privados

Cambiar a:

FieldInfo[] fi = cc.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
+2

Esto devolverá 0 elementos, también. Debe incluir BindingFlags.Instance además de BindingFlags.NonPublic. –

Cuestiones relacionadas