2013-06-08 2 views
0

как я могу получить список всех полей во всех вложенных классовSystem.Reflection GetNestetTypes Все поля объявлены Имя или значение

class AirCraft 
{ 
    class fighterJets 
    { 
     public string forSeas = "fj_f18"; 
     public string ForLand = "fj_f15"; 
    } 
    class helicopters 
    { 
     public string openFields = "Apachi"; 
     public string CloseCombat = "Cobra"; 

    } 
} 

код я пытаюсь использовать от одного из постов здесь я могу разбейте это на две или три разделенные строки кода, и он будет работать вопрос об этом выражении и использовании кратчайшего/современного кода.

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

это вернет FieldInfo не имена или значение, и мне это нужно больше как список строки или лучший словарь для обоего полех значений и имен , но список будет делать сейчас.

List<string> (or dictionary) ChosenContainersNamesOrValuesOfAllNested(Type T) 
{ 
    return a shortest syntax for that task, using lambda rather foreach 
} 

спасибо.

+0

Как вы можете получить значения полей без экземпляра каждого из классов? Ваши поля не являются статическими. –

+0

@KirkWoll в моей программе. хотя хорошо видеть оба примера с и без экземпляра – LoneXcoder

+0

, если в вашей «программе это», то это где-то еще, кроме кода, который вы отправили. –

ответ

1

Вы можете просто использовать метод Select расширения Linq, чтобы получить только имена:

IEnumerable<string> GetAllFieldNames(Type type) 
{ 
    // uses your existing method 
    return GetAllFields(type).Select(f => f.Name); 
} 

или метод ToDictionary расширения для построения словаря:

IDictionary<string, object> GetAllFieldNamesAndValues(object instance) 
{ 
    return instance.GetType() 
     .GetFields() 
     .ToDictionary(f => f.Name, f => f.GetValue(instance)); 
} 

Примечания вам понадобится экземпляр класса чтобы получить значения. Кроме того, это будет работать только для одного типа, так как для получения значений вам понадобится экземпляр каждого типа.

Однако, если вы определили свои поля, как статические вы могли бы сделать это:

class AirCraft 
{ 
    public class fighterJets 
    { 
     public static string forSeas = "fj_f18"; 
     public static string ForLand = "fj_f15"; 
    } 
    public class helicopters 
    { 
     public static string openFields = "Apachi"; 
     public static string CloseCombat = "Cobra"; 

    } 
} 

IEnumerable<FieldInfo> GetAllStaticFields(Type type) 
{ 
    return type.GetNestedTypes().SelectMany(GetAllFields) 
       .Concat(type.GetFields(BindingFlags.Public | BindingFlags.Static)); 
} 


IDictionary<string, object> GetAllStaticFieldNamesAndValues(Type type) 
{ 
    return GetAllStaticFields(type) 
     .ToDictionary(f => f.Name, f => f.GetValue(null)); 
} 

Это работает, потому что статические поля не связаны с каким-либо экземпляром класса.

+0

благодарит много помощника за четкий широкий ответ! – LoneXcoder

Смежные вопросы