0

ネストされたすべてのクラス内のすべてのフィールドのリストを取得する方法

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

    }
}

私が使用しようとしているコードは、ここの投稿の 1 つからのものです。これを 2 つまたは 3 つのコード行に分割することができます。

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
}

ありがとう。

4

1 に答える 1

1

Linq のSelect拡張メソッドを使用して、名前だけを取得できます。

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

値を取得するには、型のインスタンスが必要になることに注意してください。また、値を取得するには各タイプのインスタンスが必要になるため、これは単一のタイプに対してのみ機能します。

ただし、フィールドを static として定義した場合は、次のようにすることができます。

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

これが機能するのは、静的フィールドがクラスのインスタンスにバインドされていないためです。

于 2013-06-08T22:24:44.703 に答える