2009-06-24 12 views
15

C# dönüyor (Ben bütün alana özgü şeyler çıkardı ve hala boş bir dizi döndürür): yanaBu yansıma kodunda ne var? GetFields() İşte</p> <p>2.0 kod boş bir dizi Net

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

    } 
} 

cevap

53

parametresiz GetFields()genel alanlarını döndürür. Eğer halka açık olmayan olanlar, kullanımını isterseniz:

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

veya uygun her türlü kombinasyonu istediğiniz - ama aksi takdirde ya bulamazlar, Instance ve Static en az biri belirtmek için gereğini yapmak . Her şeyi elde etmek için hem genel hem de gerçek alanları belirtebilirsiniz:

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

+1 Bu, Örneklemeyi ve NonPublic'i belirtmeniz gerekir. –

+1

Cevabı alkış! Bunu anlamakta sorun yaşıyorum. Birisi Özel Alanlar için NonPublic ile birlikte neden Statnce veya Static gerektiğini açıklayabilir mi? – Zack

+0

@ rory.ap: Evet, tam olarak. –

10

alan özel, BindingFlags.NonPublic belirtmek için izin veren GetFields() aşırı yüklemesi kullanmanız gerekir.

, bu işi yapmak için değiştirmek için: Eğer özel (halka açıklanmamış) alanları

Değişim istediğinizi belirtmeniz gerekir

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

:

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

Bu, 0 öğeyi de döndürecektir. BindingFlags.NonPublic ek olarak BindingFlags.Instance eklemeniz gerekir. –