2009-06-24 3 views
15

C#, Net 2.0Quel est le problème avec ce code de réflexion? GetFields() retourne un tableau vide

Voici le code (j'ai pris toutes mes affaires spécifiques au domaine, et il retourne encore un tableau vide):

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; } 
     } 

    } 
} 

Répondre

53

Le parameterless GetFields() renvoie public champs. Si vous voulez les non-publics, l'utilisation:

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

ou tout autre combinaison appropriée que vous voulez - mais vous ne besoin de spécifier au moins l'un des Instance et Static, sinon il ne trouvera pas non plus. Vous pouvez spécifier les deux, et même les champs publics, pour obtenir tout:

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

+1 Ceci est l'une, vous devez * spécifier * Instance ainsi que NonPublic. –

+1

Bravo pour la réponse! J'ai du mal à le comprendre. Quelqu'un pourrait-il expliquer pourquoi Instance ou Static est requis avec NonPublic pour les champs privés? – Zack

+0

@ rory.ap: Oui, exactement. –

10

Depuis la champ est privé, vous devez utiliser la surcharge de GetFields() qui vous permet de spécifier BindingFlags.NonPublic.

Pour faire ce travail, modifiez à:

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

Vous devez spécifier que vous voulez que les champs privés (non publics)

Modification:

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

Cela retournera également 0 éléments. Vous devez inclure BindingFlags.Instance en plus de BindingFlags.NonPublic. –

Questions connexes