不明なコレクションの値を反復して印刷する一般的な方法はありますか?

.net c# expression-trees generics lambda

質問

たとえば、次のようなPrintメソッドがあります。

private static void Print(IEnumerable items)
{
    // Print logic here
}

私は、このPrintメソッドにコレクションクラスを渡したいと思います。これは、テーブルのようなすべてのフィールドを出力するはずです。たとえば、私の入力コレクションは「Persons」や「Orders」や「Cars」などです。

"車"コレクションをPrintメソッドに渡すと、Make、Color、Price、Classなどの "Car"の詳細のリストが印刷されます。

私は実行時までコレクションの種類を知らないでしょう。私はTypeDescriptorsPropertyDescriptorCollectionを使って解決を試みました。しかし、私はそれが良い解決策であるとは思わない。表現やジェネリックを使ってこれを達成する他の方法はありますか?

受け入れられた回答

次のようにPrintを実装することができます:

static void Print<T>(IEnumerable<T> items)
{
    var props = typeof(T).GetProperties();

    foreach (var prop in props)
    {
        Console.Write("{0}\t", prop.Name);
    }
    Console.WriteLine();

    foreach (var item in items)
    { 
        foreach (var prop in props)
        {
            Console.Write("{0}\t", prop.GetValue(item, null));
        }
        Console.WriteLine();
    }
}

これはクラスの各プロパティをループしてプロパティの名前を出力し、各アイテムに印刷し、各アイテムに対してプロパティの値を出力します。

私はあなたがここでジェネリックスを使うべきだと主張するでしょう(他の答えの示唆とは対照的に)。テーブルヘッダーを印刷できるように、コレクション内のアイテムを単一の型にする必要があります。

表の書式設定では、 この質問に対する回答を確認できます。


人気のある回答

オブジェクトのToString()メソッドをオーバーライドして、表示したいすべての情報を含め、必要に応じていつでも呼び出すことができます。表現やジェネリックの必要はありません。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow