Esiste un metodo generico per iterare e stampare valori in una collezione sconosciuta?

.net c# expression-trees generics lambda

Domanda

Diciamo, ho un metodo di stampa come questo:

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

Voglio passare una classe di raccolta a questo metodo di stampa, che dovrebbe stampare tutti i campi come una tabella. Ad esempio, la mia raccolta di input può essere "Persone" o "Ordini" o "Automobili" ecc.

Se passo la collezione "Cars" al metodo Print, dovrebbe stampare la lista dei dettagli "Car" come: Make, Color, Price, Class ecc.

Non conoscerò il tipo di raccolta fino al momento dell'esecuzione. Ho provato e ottenuto una soluzione utilizzando TypeDescriptors e PropertyDescriptorCollection . Ma non credo che sia una buona soluzione. C'è un altro modo per ottenere questo usando espressioni o generici?

Risposta accettata

Potresti implementare la stampa in questo modo:

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

Semplicemente esegue il ciclo su ciascuna proprietà della classe per stampare il nome della proprietà, quindi stampa su ciascun elemento e per ciascun elemento stampa i valori delle proprietà.

Direi che dovresti usare i generici qui (al contrario dei suggerimenti in altre risposte); si desidera che gli elementi nella raccolta siano di un singolo tipo in modo da poter stampare le intestazioni della tabella.

Per la formattazione della tabella è possibile controllare le risposte a questa domanda .


Risposta popolare

Sostituisci il metodo ToString() dell'oggetto per includere tutte le informazioni che desideri visualizzare e poi chiamalo semplicemente quando lo desideri. Non c'è bisogno di espressioni o di generici.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow