2009-06-24 13 views
15

C#, Net 2.0Cosa c'è di sbagliato con questo codice di riflessione? GetFields() restituisce un array vuoto

Ecco il codice (ho tirato fuori tutta la mia roba specifico del dominio, e restituisce ancora un array vuoto):

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

    } 
} 

risposta

53

Il senza parametri GetFields() restituisce i campi pubblici. Se si desidera che quelli non pubblici, uso:

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

o quello che volete combinazione appropriata - ma si fai necessità di specificare almeno uno dei Instance e Static, altrimenti non troverà neanche. È possibile specificare entrambi, e anche i campi pubblici, per ottenere tutto:

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

+1 Questo è l'unico, * necessario * specificare Istanza e Non pubblico. –

+1

Cheers per la risposta! Ho problemi a capirlo comunque. Qualcuno potrebbe spiegare perché è richiesto Instance o Statico insieme a NonPublic per i campi privati? – Zack

+0

@ rory.ap: Sì, esattamente. –

10

Dal momento che la il campo è privato, è necessario utilizzare il sovraccarico di GetFields() che consente di specificare BindingFlags.NonPublic.

per fare questo lavoro, modificarla in:

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

È necessario specificare che si desidera che il (non pubblici) campi privati ​​

Passa a:

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

Ciò restituirà anche 0 elementi. È necessario includere BindingFlags.Instance in aggiunta a BindingFlags.NonPublic. –

Problemi correlati