2013-03-12 8 views
14

静的クラスが多く含まれています。各内部静的クラスにはフィールドが含まれます。すべての内部静的クラスのフィールドを取得したい。静的クラス内のすべてのフィールドを静的クラス内のリフレクションで取得する

public static class MyClass 
{ 
    public static class MyInnerClass1 
    { 
     public const string Field1 = "abc"; 
     public const string Field2 = "def"; 
     public const string Field3 = "ghi"; 
    } 
    public static class MyInnerClass2 
    { 
     public const int Field1 = 1; 
     public const int Field2 = 2; 
     public const int Field3 = 3; 
    } 
    ... 
} 

それぞれの内部クラスの名前の後ろに、各フィールドの名前と値を印刷したいと思います。例えば

MyInnerClass

フィールド1 = "ABC"

...私はすべてのクラスの名前を取得しても問題がない

var members = typeof(MyClass).GetMembers(BindingFlags.Public | BindingFlags.Static); 

var str = ""; 
foreach (var member in members) 
{ 
    str += member.Name +" ";    
} 

または特定のクラスの名前とすべてのフィールドの値:

var fields = typeof(MyClass.MyInnerClass1).GetFields(); 
foreach (var field in fields) 
{ 
    str += field.Name + "-"; 
    str += field.GetValue(typeof(MyClass.MyInnerClass1)); 
} 

しかし、私はこれをどのように組み合わせるのですか? 内部静的クラスの名前と数が変更されることがあります。

答えて

16

は、以下の

var builder = new StringBuilder(); 
foreach (var type in typeof(MyClass).GetNestedTypes(BindingFlags.Public | BindingFlags.NonPublic)) 
{ 
    if (!type.IsAbstract) 
    { 
    continue; 
    } 

    builder.AppendLine(type.Name); 
    foreach (var field in type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)) { 
    var msg = String.Format("{0} = {1}", field.Name, field.GetValue(null)); 
    builder.AppendLine(msg); 
    } 
} 

string output = builder.ToString(); 

!type.IsAbstractの使用を試してみては非静的ネストされた型に雑草に行われます。 C#の静的型はabstractとして生成されます。

私の解決策は、publicと非公開のメンバー(両方のタイプとフィールドの両方)を取得します。私はこれがあなたの意図かどうか分からないので、私の解決策のその部分を修正したいかもしれません。

9

あなたはtype.GetNestedTypes()を再帰的にループを行う必要があります。

IEnumerable<FieldInfo> GetAllFields(Type type) { 
    return type.GetNestedTypes().SelectMany(GetAllFields) 
       .Concat(type.GetFields()); 
} 
関連する問題