2009-06-24 3 views
15

のC#を返して:以来このリフレクションコードの何が問題なのですか?れるGetFields()純2.0</p> <p>は、ここでは、コード(私はすべてのドメイン固有のものを取り出して、それはまだ空の配列を返します)ですが、空の配列

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

    } 
} 

答えて

53

パラメータなしGetFields()公開フィールドを返します。あなたは非パブリックなものをしたい場合は、以下を使用します。

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

または適切などんな組み合わせしたい - しかし、あなたはは、それ以外の場合はどちらか見つけることができません、少なくともInstanceの一つとStaticを指定する必要があります

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

+1これは1つです。インスタンスとNonPublicを指定する必要があります。 –

+1

答えに乾杯!私はそれを理解するのに困っている。誰かが非公開のフィールドのためにNonPublicと共にインスタンスまたはスタティックが必要な理由を説明してもらえますか? – Zack

+0

@ rory.ap:そうです。 –

10

フィールドがプライベートである場合、BindingFlags.NonPublicを指定できるGetFields()のオーバーロードを使用する必要があります。

は、この仕事をするためにそれを変更するには:あなたはプライベート(非公開)フィールド

変更することを指定する必要が

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

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

これで、0要素も戻されます。 BindingFlags.NonPublicに加えてBindingFlags.Instanceを含める必要があります。 –

関連する問題