Generación dinámica de objetos con ExpandoObject

Contenidos

Necesitaba convertir un archivo de Excel con sus propias columnas definidas a uno nuevo con columnas dinámicas, y estaba un poco confundido acerca de cómo hacerlo correctamente sin algunos problemas graves de rendimiento.

Vine a un tutorial que puedes hallar aquí usando .NET ExpandoObject lo que prácticamente le posibilita crear un objeto y agregar miembros dinámicos.

ExpandoObject

La definición de Microsoft es:

Representa un objeto cuyos miembros se pueden agregar y borrar dinámicamente en tiempo de ejecución.

Y tiene algunas observaciones:

La clase ExpandoObject le posibilita agregar y borrar miembros de sus instancias en tiempo de ejecución, y además determinar y obtener valores para estos miembros. Esta clase admite el link dinámico, que le posibilita usar una sintaxis estándar como sampleObject.sampleMember en lugar de una sintaxis más compleja como sampleObject.GetAttribute («sampleMember»).

Comportamiento actual

Tenemos una ExcelExportServiceque, al pasar un Lista , para este caso ExcelItem, lo usaremos Reflexión para crear un xlsx archivo.

Hasta el momento, nuestro código se ve así:

emi20120ok-8070408

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

emi20220ok-8449352

Este enfoque funciona estupendamente, el archivo xlsx se genera sin problemas y cada columna es cada propiedad, usaría esto GetExcelBytes método como este, a modo de ejemplo para guardarlo en un archivo:

emi20320ok-6114359

El problema

Dado que lo que estamos haciendo bien es utilizar todas las propiedades del ExcelItem objeto, todo lo que quiero es no usarlos todos, solo utilizar 2 o 3 de ellos.

Además es un requisito que no desee cambiar el código, todo debe hacerlo el administrador que decidirá qué columnas deben mostrarse y puede que conozca o no 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 norte propiedades de ese objeto, pero por lo visto no está codificado.

Columnas dinámicas

El cambio sería usar un dinámica objeto, debido a que nos gustaría determinar qué propiedades del objeto se utilizarán para generar la lista de columnas.

Digamos que tenemos un objeto con muchas propiedades, como tonelada de ellos, y verdaderamente no queremos cambiar el ExcelItem objeto cada vez que hacemos un cambio, creamos un ColumnExcelItem tabla, que se utilizará para generar ese ExcelItem.

Estructura de la base de datos

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

emi20520ok-5435136

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

Además tenga en cuenta que Nombre de la propiedad debe coincidir con el nombre de propiedad del objeto que usaré para el mapeo dinámico.

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 para esta parte, saltaré al comienzo del nuevo. GetExcelBytes () función.

emi20620ok-8578126

Ahora tendremos que crear un objeto con algunas de las propiedades de ExcelItem, pero totalmente dinámico. En lugar de utilizar las 6 propiedades, solo usamos 3 de ellas, la que solo queremos enviar.

Ahora imagina que esto ExcelItem el objeto tiene 200 propiedades, enojado, pero podría suceder.

Lo único que tengo que hacer es insertar esas propiedades que quiero representar en el archivo de Excel en ese ColumnExcelItem mesa y eso es todo.

Casos

En esta circunstancia, solo usamos un caso único, pero supongamos que desea tener informes diferentes para algunos usuarios. Digamos que el administración role debería obtener todas las propiedades, después crearía algo como esta estructura en la base de datos.

emi20720ok-1815905

emi20820ok-6937663

Posteriormente, cuando obtenga la plantilla, podría tener diferentes columnas, todas de forma dinámica y sin código relacionado.

Si tenemos un usuario con el rol Administradores, el archivo contendrá columnas Vamos, batata, Apellido, Edad, Creado en, Actualizado en.

En el caso de que generemos con el Usuarios papel, que tendra Batata, Edad. Apellido.

Conclusión

Esta es una magnífica manera de aprender a dinámica funciona en .NET y es una muy buena solución cuando necesita tener diferentes roles o plantillas para diferentes usuarios y no está verdaderamente interesado en dedicar tiempo a codificar.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.