Generazione di oggetti dinamici con ExpandoObject

Contenuti

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 qui 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 Pronto , per questo caso ExcelItem, lo usaremos Reflexión para crear un xlsx archivio.

Fino ad ora, 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

Il problema

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

Además es un requisito que no desee cambiar el código, todo debe hacerlo el amministratore 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 Nord propiedades de ese objeto, pero por lo visto no está codificado.

Columnas dinámicas

El cambio sería usar un dinamico oggetto, 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, Che cosa tonelada de ellos, y verdaderamente no queremos cambiar el ExcelItem objeto cada vez que hacemos un cambio, creiamo un ColumnExcelItem tavolo, 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 oggetto, puesto que tiene 6 propiedades y solo tenemos 3 incluido en la base de datos.

Inoltre, tieni presente che 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 () funzione.

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 proprietà, solo usamos 3 di loro, la que solo queremos enviar.

Ahora imagina que esto ExcelItem el objeto tiene 200 proprietà, 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

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

emi20720ok-1815905

emi20820ok-6937663

Successivamente, 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 Andiamo, batata, Apellido, Età, Creado en, Actualizado en.

En el caso de que generemos con el Utenti carta, que tendra Batata, Età. Apellido.

conclusione

Esta es una magnífica manera de aprender a dinamico 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.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.