20

ArrayList (おそらくオブジェクトでいっぱい) を取り込み、ArrayList 内の各オブジェクトのすべてのフィールド (およびその値) をリストするメソッドを構築しています。

現在、私のコードは次のとおりです。

public static void ListArrayListMembers(ArrayList list)
    {
        foreach (Object obj in list)
        {
            Type type = obj.GetType();
            string field = type.GetFields().ToString();
            Console.WriteLine(field);

        }
    }

もちろん、このコードの差し迫った問題は理解しています。それが機能したとしても、ArrayList 内のオブジェクトごとに 1 つのフィールドしか出力されません。これは後で修正します。現在、オブジェクトに関連付けられているすべてのパブリック フィールドを取得する方法に興味があります。

4

5 に答える 5

34
foreach (Object obj in list) {
    Type type = obj.GetType();

    foreach (var f in type.GetFields().Where(f => f.IsPublic)) {
        Console.WriteLine(
            String.Format("Name: {0} Value: {1}", f.Name, f.GetValue(obj));
    }                           
}

このコードが動作するには .NET 3.5 が必要であることに注意してください ;-)

于 2008-10-26T00:42:03.983 に答える
10

BindingFlags を使用して、クラスで直接宣言されたすべてのオブジェクト フィールドを取得できます。

GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)

および継承されたものを含むすべてのオブジェクトフィールド:

GetFields(BindingFlags.Public | BindingFlags.Instance)
于 2008-10-26T01:09:15.723 に答える
4
public static void ListArrayListMembers(ArrayList list)
{
    foreach (Object obj in list)
    {
        Type type = obj.GetType();
        Console.WriteLine("{0} -- ", type.Name);
        Console.WriteLine(" Properties: ");
        foreach (PropertyInfo prop in type.GetProperties())
        {
            Console.WriteLine("\t{0} {1} = {2}", prop.PropertyType.Name, 
                prop.Name, prop.GetValue(obj, null));
        }
        Console.WriteLine(" Fields: ");
        foreach (FieldInfo field in type.GetFields())
        {
            Console.WriteLine("\t{0} {1} = {2}", field.FieldType.Name, 
                field.Name, field.GetValue(obj));
        }
    }
}

MSDNで定義されている type.GetFields() のように、フィールドで IsPublic を探す必要がないことを述べておきます。

戻り値 - タイプ: System.Reflection.FieldInfo[]

現在の Type に対して定義されているすべてのパブリック フィールドを表す FieldInfo オブジェクトの配列。

于 2008-10-26T00:54:50.153 に答える
4

もちろん、もう 1 つの質問は、「なぜ public フィールドを持っているのですか?」ということです。- 特性が好ましい。抽象化として、リフレクションが唯一のオプションではないことに注意してください。型が実行時にオンザフライでプロパティを公開することも可能です (型指定されていないDataTable/DataView列をプロパティとして公開する方法のように)。

これをサポートするには (単純なオブジェクトもサポートしながら)、次を使用しますTypeDescriptor

        foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
        {
            Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
        }

これにより、多数の拡張オプションも可能になります。たとえば、リフレクションを大幅に高速化できます (コードを変更する必要はありません)。

于 2008-10-26T10:09:02.810 に答える
1
    static void ListArrayListMembers(ArrayList list)
    {
        foreach (object obj in list)
        {
            Type type = obj.GetType();
            foreach (FieldInfo field in type.GetFields(BindingFlags.Public))
            {
                Console.WriteLine(field.Name + " = " + field.GetValue(obj).ToString());
            }
        }
    }
于 2008-10-26T00:56:53.753 に答える