Gibt es eine generische Methode zum Iterieren und Drucken von Werten in einer unbekannten Sammlung?

.net c# expression-trees generics lambda

Frage

Nehmen wir an, ich habe eine Print-Methode wie folgt:

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

Ich möchte eine Collection-Klasse an diese Print-Methode übergeben, die alle Felder wie eine Tabelle drucken soll. Zum Beispiel kann meine Eingabesammlung "Personen" oder "Bestellungen" oder "Autos" usw. sein.

Wenn ich die "Cars" -Kollektion an die Print-Methode übergebe, sollte sie die Liste der "Car" -Details ausdrucken, wie zB: Marke, Farbe, Preis, Klasse usw.

Ich werde den Typ der Sammlung erst zur Laufzeit wissen. Ich habe versucht und eine Lösung mit TypeDescriptors und PropertyDescriptorCollection . Aber ich halte das nicht für eine gute Lösung. Gibt es einen anderen Weg, dies mit Hilfe von Ausdrücken oder Generika zu erreichen?

Akzeptierte Antwort

Sie könnten Print wie folgt implementieren:

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

Es führt einfach eine Schleife über jede Eigenschaft der Klasse durch, um den Namen der Eigenschaft zu drucken, druckt dann über jedes Element und für jedes Element gibt es die Werte der Eigenschaften aus.

Ich würde argumentieren, dass Sie hier Generika verwenden sollten (im Gegensatz zu Vorschlägen in anderen Antworten); Sie möchten, dass die Elemente in der Auflistung einen einzelnen Typ aufweisen, sodass Sie Tabellenköpfe drucken können.

Für die Tabellenformatierung können Sie die Antworten auf diese Frage überprüfen.


Beliebte Antwort

ToString() die ToString() -Methode des Objekts, um alle Informationen ToString() die Sie anzeigen möchten, und rufen Sie sie dann einfach auf, wann immer Sie möchten. Keine Notwendigkeit für Ausdrücke oder Generika.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum