Udostępnij za pośrednictwem


#retosMSDN: Reto 3 – Volcando objetos en C#

 

¡Ya está aquí el tercero de los #retosMSDN! Pero esta vez el reto no lo ponemos nosotros. Eduard Tomàs ( @eiximenis ), MVP en ASP.NET, nos ha propuesto el siguiente reto. ¿Estás preparado?

 

El Reto

El objetivo del reto es crear una clase ObjectDumper que permita obtener la información de las propiedades que tenga un objeto.

Dicha clase debe tener un método Dump() que reciba el objeto y debe devolver una colección de KeyValuePair<string, string> donde:

· El valor de la propiedad “Key” es el nombre de la propiedad

· El valor de la propiedad “Value” es el valor de la propiedad (por defecto convertido a cadena).

Dicha colección debe estar ordenada por el nombre de la propiedad.

Así para ver las propiedades de un objeto por pantalla podríamos tener el siguiente código:

 

 var desc = dumper.Dump(ufo);
foreach (var line in desc)
{
    Console.WriteLine(string.Format("{0}:{1}", line.Key, line.Value));
}

 

P. ej. si tenemos un objeto como el siguiente:

 

 var ufo = new Ufo()
{
    Name = "Conqueror III",
    Speed = 10,
    Origin = new Planet()
    {
        Name = "Alpha Centauri 3",
        DaysPerYear = 452
    }
};

 

Y mostrásemos por pantalla la información, la salida sería algo como:

 

image

 

La clase ObjectDumper debe ofrecer un método AddTemplateFor para permitir especificar una plantilla (un método) para convertir a cadena aquellas propiedades especiales. El uso de dicho método sería como sigue:

 

 dumper.AddTemplateFor(u => u.Origin, p=>string.Format("({0},{1})", p.Name, p.DaysPerYear));

El primer parámetro (u=>u.Origin) indica la propiedad para la cual se desea establecer la plantilla, mientras que la segunda expresión indica el código a usar para pasar los valores de dicha propiedad a cadena.

Con esa plantilla añadida la salida por pantalla sería:

 

image

 

Por último, debe evitarse llamar a las propiedades del objeto que está siendo “volcado” hasta que no es necesario. P. ej. en este caso, solo se invocaria la propiedad Name del objeto “ufo” :

 

 var desc = dumper.Dump(ufo);
var nameProp = desc.First();

Ni la propiedad “Origin”, ni la “Speed” son invocades debido a que en ningún momento se consultan.

 

Puedes apoyarte en los tests unitarios incluidos en este proyecto de Visual Studio 2013 que puedes descargarte de GitHub para verificar que tu implementación es correcta.

 

La Solución

¿Ya lo has resuelto? Comparte con nosotros tu solución de Visual Studio en esmsdn@microsoft.com.

El viernes de la semana que viene, el día 10 de octubre, publicaremos la solución que Eduard nos ha proporcionado para el reto.

¡Actualización! Solución al Reto 3 – Volcando objetos en C#

 

¿Conoces…

… la palabra clave yield de C#? Puede serte útil.

 

Si tienes cualquier duda o problema durante la resolución del reto, o si quieres retar al resto de la comunidad como ha hecho Eduard, no dudes en ponerte en contacto con nosotros.

¡¡¡Muchas gracias Eduard por hacer nuestra semana más interesante!!!

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

Comments

  • Anonymous
    October 09, 2014
    Hala, acabo de mandaros la solución. La parte de los formateadores especiales para mí ha sido la más complicada. Pero al fin creo que lo he conseguido. XD

  • Anonymous
    October 09, 2014
    Sin duda la parte de los templates es la más complicada, por lo menos el como tratar el segundo parametro. Al final voy a tener que esperar a ver la solución :S

  • Anonymous
    March 02, 2016
    Un poco tarde, pero ahí va una posible solución un poco más genérica en lo que concierne al objecto contenedor de salida. Se hace uso de unas cuentas extensiones.https://github.com/jrgcubano/ObjectDumper