2013-03-12 12 views
14

Mam klasę statyczną, która zawiera wiele klas statycznych. Każda wewnętrzna klasa statyczna zawiera pola. Chcę uzyskać wszystkie pola wszystkich wewnętrznych klas statycznych.Pobierz wszystkie pola z klas statycznych w klasie statycznej z odbiciem

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

Chciałbym wydrukować nazwę każdej klasy wewnętrznej, a następnie nazwę i wartość każdego pola.

Na przykład:

MyInnerClass

Pole1 = "abc"

...

mam żadnego problemu z uzyskaniem imieniu wszystkich klas:

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

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

lub nazwa i wartość wszystkich pól w określonej klasie:

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

Ale jak mogę to połączyć? Nazwy i liczba wewnętrznych klas statycznych może się zmienić.

Odpowiedz

16

Wypróbuj następujące

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(); 

Zastosowanie !type.IsAbstract odbywa się chwastów na non-statycznych zagnieżdżonych typów. Statyczny typ w języku C# jest generowany pod maską jako abstract.

Również moje rozwiązanie odbierze zarówno od public, jak i niepublicznych członków (zarówno typy, jak i pola). Nie jestem pewien, czy to był twój zamiar, czy nie, więc możesz zmodyfikować tę część mojego rozwiązania.

9

Trzeba rekursywnie pętlę przez type.GetNestedTypes():

IEnumerable<FieldInfo> GetAllFields(Type type) { 
    return type.GetNestedTypes().SelectMany(GetAllFields) 
       .Concat(type.GetFields()); 
} 
Powiązane problemy