Existe-t-il une méthode générique pour itérer et imprimer une valeur dans une collection inconnue?

.net c# expression-trees generics lambda

Question

Disons que j'ai une méthode d'impression comme celle-ci:

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

Je souhaite passer une classe de collection à cette méthode Print, qui doit imprimer tous les champs comme une table. Par exemple, ma collection d'entrées peut être "Personnes" ou "Commandes" ou "Voitures", etc.

Si je transmets la collection "Cars" à la méthode Print, la liste des détails "Car", tels que: Marque, Couleur, Prix, Classe, etc. doit être imprimée.

Je ne saurai pas le type de la collection avant l'exécution. J'ai essayé et obtenu une solution utilisant TypeDescriptors et PropertyDescriptorCollection . Mais je ne pense pas que ce soit une bonne solution. Existe-t-il un autre moyen d'y parvenir en utilisant des expressions ou des génériques?

Réponse acceptée

Vous pouvez implémenter Print comme ceci:

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

Il boucle simplement sur chaque propriété de la classe pour imprimer le nom de la propriété, puis imprime sur chaque élément et pour chaque élément, il affiche les valeurs des propriétés.

Je dirais que vous devriez utiliser des génériques ici (plutôt que des suggestions dans d'autres réponses); vous souhaitez que les éléments de la collection soient d'un seul type pour pouvoir imprimer des en-têtes de tableau.

Pour le formatage de tableau, vous pouvez vérifier les réponses à cette question .


Réponse populaire

Remplacez la méthode ToString() l'objet pour inclure toutes les informations que vous souhaitez afficher, puis appelez-la simplement quand vous le souhaitez. Pas besoin d'expressions ou de génériques.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi