FastDynamic una alternativa eficiente a Reflection

Hace unos años cuando trabajaba para Solid escribí un artículo Cargar listas desde un datareader con DynamicMethod . En él hacía uso de DynamicMethod para crear métodos en tiempo de ejecución para acceder a propiedades de objetos.

Ahora he querido  escribir una pequeñísima librería (379 líneas de código) basada en aquella idea que permita, de forma eficiente, acceder no sólo a propiedades sino también a campos públicos, además de poder crear objetos al vuelo, una alternativa eficiente a Activator.CreateInstance.

FastDynamic es mucho más eficiente que reflection,  Aquí tenéis el resultado de un microbenchmak:

Using reflection.. 1480 ms
Using CreateObject, GetMemberValue and SetMemberValue.. 621 ms
Using getters, setters and activator .. 85 ms
Known at compile time.. 9 ms

FastDynamic es además más fácil de usar. Por ejemplo para obtener el valor de una propiedad sólo tienes que escribir obj.GetMemberValue(«NombrePropiedad»).

¿Para qué está indicado FastDynamic?. Bien, su uso estaría indicado en aquellas aplicaciones que trabajan con tipos no conocidos en tiempo de compilación, pero que sí se conocen en tiempo de ejecución. Que necesitan crear objetos de estos tipos, o que necesitan acceder a sus propiedades y campos públicos.

Una aplicación de FastDynamic sería por ejemplo para crear un exportador a ficheros csv. Este exportador le pasaríamos un IEnumerable con los objetos de la lista a exportar, y una lista de propiedades que quisiéramos incluir, junto con los encabezados de las columnas. Evidentemente el exportador no conoce en tiempo de compilación el tipo de los objetos, ni siquiera el nombre de las propiedades. En un próximo blog post os presentaré una implementación de este exportador.

FastDynamic también sería también útil para una framework de serialización como SharpSerializer ( http://sharpserializer.codeplex.com/discussions/361322) que usa Reflection de forma extensiva. Por cierto tengo planeado hacer un fork de esta librería para añadir capacidad de serialización de campos públicos y aumentar su rendimiento usando FastDynamic.

Por cierto FastDynamic está aquí : https://github.com/jesuslpm/FastDynamic

Saludos:

Jesús López

 

 

 

 

 

 

2 comentarios sobre “FastDynamic una alternativa eficiente a Reflection”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *