¿Existe un método genérico para iterar e imprimir valores en una colección desconocida?

.net c# expression-trees generics lambda

Pregunta

Digamos, tengo un método de impresión como este:

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

Quiero pasar una clase de colección a este método de impresión, que debería imprimir todos los campos como una tabla. Por ejemplo, mi colección de entrada puede ser "Personas" o "Pedidos" o "Coches", etc.

Si paso la colección "Cars" al método de impresión, debería imprimir la lista de detalles de "Car" como: Marca, Color, Precio, Clase, etc.

No sabré el tipo de la colección hasta el tiempo de ejecución. TypeDescriptors y TypeDescriptors una solución utilizando TypeDescriptors y PropertyDescriptorCollection . Pero, no creo que sea una buena solución. ¿Hay alguna otra manera de lograr esto usando expresiones o genéricos?

Respuesta aceptada

Podrías implementar Imprimir así:

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

Simplemente recorre cada propiedad de la clase para imprimir el nombre de la propiedad, luego imprime sobre cada elemento y para cada elemento imprime los valores de las propiedades.

Yo diría que debería usar los genéricos aquí (a diferencia de las sugerencias en otras respuestas); desea que los elementos de la colección sean de un solo tipo para poder imprimir encabezados de tablas.

Para el formato de tabla puede verificar las respuestas a esta pregunta .


Respuesta popular

Reemplace el método ToString() del objeto para incluir toda la información que le gustaría mostrar, y luego simplemente ToString() cuando lo desee. No hay necesidad de expresiones o genéricos.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow