2009-06-24 9 views
15

C#, .NET 2.0Co jest nie tak z tym kodem odbitek? GetFields() zwraca pustą tablicę

Oto kod (wyjąłem wszystkie moje domeny specyficzne rzeczy, i nadal zwraca pustą tablicę):

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

    } 
} 

Odpowiedz

53

bez parametrów GetFields() zwraca publicznych pól. Jeśli chcesz jedynek niepubliczne, przeznaczenie:

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

lub cokolwiek odpowiednią kombinacją chcesz - ale zrobić potrzebę określenia, co najmniej jeden z Instance i Static, inaczej nie znajdzie albo. Możesz podać oba, a nawet publiczne pola, aby uzyskać wszystko:

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

+1 To jest to, * musisz * określać instancję oraz NonPublic. –

+1

Pozdrawiam za odpowiedź! Mam jednak problem z jego zrozumieniem. Czy ktoś mógłby wyjaśnić, dlaczego instancja lub statystyka jest wymagana wraz z NonPublic dla pól prywatnych? – Zack

+0

@ rory.ap: Tak, dokładnie. –

10

Ponieważ pole jest prywatne, musisz użyć przeciążenia GetFields(), które pozwala określić BindingFlags.NonPublic.

Aby uczynić tę pracę, zmień go na:

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

musisz określić, że chcesz prywatne (niepubliczne) pola

Zmiana:

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

Spowoduje to również powrót elementów zerowych. Oprócz BindingFlags.NonPublic musisz dołączyć BindingFlags.Instance. –

Powiązane problemy