Menu

Generaci贸n din谩mica de objetos con ExpandoObject

Generaci贸n din谩mica de objetos con ExpandoObject

He necesitado convertir un archivo de Excel con sus propias columnas definidas en uno nuevo con columnas din谩micas, y estaba un poco confundido sobre c贸mo hacerlo correctamente sin algunos problemas de rendimiento graves.

 

Llegu茅 a un tutorial que puedes encontrar aquí que utiliza .NET ExpandoObject que pr谩cticamente te permite crear un objeto y agregar miembros din谩micos.


ExpandoObject

La definici贸n de Microsoft es:

Representa un objeto cuyos miembros se pueden agregar y eliminar din谩micamente en tiempo de ejecuci贸n.

 

Y tiene algunas observaciones:

La clase ExpandoObject le permite agregar y eliminar miembros de sus instancias en tiempo de ejecuci贸n y tambi茅n establecer y obtener valores de estos miembros. Esta clase admite el enlace din谩mico, que le permite utilizar una sintaxis est谩ndar como sampleObject.sampleMember en lugar de una sintaxis m谩s compleja como sampleObject.GetAttribute ("sampleMember").

 

Comportamiento actual

Tenemos un ExcelExportServiceque, al pasar un List<T>, en este caso ExcelItem, lo usaremos Reflection para crear un xlsx archivo.

Hasta ahora, nuestro c贸digo se ve as铆:

 

ExcelItem es el objeto con todas las propiedades que se utilizan para generar el archivo de Excel.

 

Este enfoque funciona perfectamente, el xlsxarchivo se genera sin problemas con cada columna siendo cada propiedad, usar铆a este GetExcelBytes m茅todo de esta manera, por ejemplo, para guardarlo en un archivo:


 

El problema

Como lo que estamos haciendo bien es usar todas las propiedades del ExcelItem objeto, todo lo que quiero es no usarlas todas, solo usar 2 o 3 de ellas.

Tambi茅n es un requisito que no quiera cambiar el c贸digo, todo lo debe hacer el administrator que decidir谩 qu茅 columnas se deben mostrar y 茅l puede o no conocer las propiedades del c贸digo.

TLDR: todo debe ser din谩mico, tenemos un objeto con propiedades y debemos asegurarnos de que el archivo generado tenga N propiedades de ese objeto, pero obviamente no est谩 codificado.
 

Columnas din谩micas

El cambio ser铆a usar un dynamic objeto, porque nos gustar铆a establecer qu茅 propiedades del objeto se usar谩n para generar la lista de columnas.

Digamos que tenemos un objeto con muchas propiedades, como una tonelada de ellas, y realmente no queremos cambiar el ExcelItem objeto cada vez que hacemos un cambio, creamos una ColumnExcelItem tabla, que se utilizar谩 para generar eso ExcelItem.
 

Estructura de la base de datos

Guardamos esta definici贸n en nuestra base de datos con algo como esto:

 

Tenga en cuenta que tenemos menos valores que las propiedades existentes del ExcelItem objeto, ya que tiene 6 propiedades y solo las hemos 3 incluido en la base de datos.

 

Tambi茅n tenga en cuenta que PropertyName debe coincidir con el nombre de propiedad del objeto que usar茅 para la asignaci贸n din谩mica.

 

Construyendo el objeto

Ahora que tenemos la tabla de la base de datos, necesitamos construir el repositorio para obtener eso y poder usarlos en el c贸digo.

No har茅 un tutorial de esta parte, saltear茅 al comienzo de la nueva GetExcelBytes() funci贸n.

Ahora tendremos que crear un objeto con algunas de las propiedades de ExcelItem, pero completamente din谩mico. En lugar de usar las 6 propiedades, solo estamos usando 3 de ellas, la que solo queremos enviar.

 

Ahora imaginemos que este ExcelItem objeto tiene 200 propiedades, loco, pero podr铆a suceder.

 

Lo 煤nico que tengo que hacer es insertar esas propiedades que quiero representar en el archivo de Excel en esa ColumnExcelItem tabla y eso es todo.

 

Casos

En este caso, solo usamos un solo caso, pero supongamos que desea tener informes diferentes para algunos usuarios. Digamos que el admin rol debe obtener todas las propiedades, entonces crear铆a algo como esta estructura en la base de datos.

 

 

Luego, al obtener la plantilla, podr铆a tener diferentes columnas, todas din谩micamente y sin c贸digo relacionado.

 

Si tenemos un usuario con el rol Admins, el archivo contendr谩 columnas IdNameSurnameAgeCreatedAtUpdatedAt.

 

En el caso si es que generamos con el Users papel, que tendr谩 Name, AgeSurname.

 

Conclusi贸n

Esta es una forma genial de aprender c贸mo dynamic funciona en .NET, y es una soluci贸n realmente buena cuando necesita tener diferentes roles o plantillas para diferentes usuarios, y no est谩 realmente interesado en invertir tiempo en la codificaci贸n.

 

Categor铆as
 
Posts relacionados
驴Qu茅 es y para qu茅 sirve un TDD o Test Driven Development?
Publicado por Sergio Darias P茅rez  |  16 febrero 2023

En este post te explicamos en que consiste el enfoque de TDD o Test Driven Development durante el ciclo de vida del software y cu谩les son sus ventajas

Leer m谩s
Descubriendo Extensiones 脷nicas para Visual Studio Code: Rest Client
Publicado por H茅ctor Garc铆a Delgado  |  30 agosto 2022

C贸mo probar y trabajar con una API web desde Visual Studio Code gracias a Rest Client. En este post te contamos como funciona paso a paso 馃槈

Leer m谩s
Qu茅 es la Programaci贸n Orientada a Objetos
Publicado por Sergio Darias P茅rez  |  26 noviembre 2021

¿Qu茅 es la POO o Programaci贸n Orientada a Objetos? Este paradigma de prorgamaci贸n, permite que el c贸digo sea reutilizable, organizado y sencillo de mantener

Leer m谩s