2013-03-12 106 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()); 
}