Génération d'objet dynamique avec ExpandoObject

Contenu

J'avais besoin de convertir un fichier Excel avec ses propres colonnes définies en un nouveau avec des colonnes dynamiques, et j'étais un peu confus quant à la façon de bien faire les choses sans problèmes de performances sérieux.

Je suis venu à un tutoriel que vous pouvez trouver ici en utilisant .NET ExpandoObject qui vous permet pratiquement de créer un objet et d'ajouter des membres dynamiques.

ExpandoObject

La définition de Microsoft est:

Représente un objet dont les membres peuvent être ajoutés et supprimés dynamiquement au moment de l'exécution.

Et tu as des remarques:

La classe ExpandoObject vous permet d'ajouter et de supprimer des membres de vos instances lors de l'exécution, et aussi déterminer et obtenir des valeurs pour ces membres. Cette classe prend en charge le lien dynamique, qui vous permet d'utiliser une syntaxe standard comme sampleObject.sampleMember au lieu d'une syntaxe plus complexe comme sampleObject.GetAttribute (“échantillonMembre”).

Comportement actuel

Nous avons une ExcelExportServiceque, lors du passage d'un Lister , pour ce cas Élément Excel, nous allons l'utiliser Réflexion créer un xlsx archiver.

Jusqu'au moment, notre code ressemble à ceci:

emi20120ok-8070408

Élément Excel est l'objet avec toutes les propriétés utilisées pour générer le fichier Excel.

emi20220ok-8449352

Cette approche fonctionne très bien, le fichier xlsx est généré sans problème et chaque colonne est chaque propriété, j'utiliserais ça Obtenir les octets Excel méthode comme celle-ci, comme exemple pour l'enregistrer dans un fichier:

emi20320ok-6114359

Le problème

Puisque ce que nous faisons bien, c'est d'utiliser toutes les propriétés du Élément Excel objet, tout ce que je veux c'est ne pas les utiliser tous, il suffit d'utiliser 2 O 3 d'eux.

C'est aussi une exigence que vous ne vouliez pas changer le code, tout doit être fait par le administrateur qui décidera quelles colonnes doivent être affichées et peut ou non connaître les propriétés du code.

TLDR: tout doit être dynamique, nous avons un objet avec des propriétés et nous devons nous assurer que le fichier généré a Nord propriétés de cet objet, mais apparemment il n'est pas encodé.

Colonnes dynamiques

Le changement serait d'utiliser un dynamique objet, parce que nous aimerions déterminer quelles propriétés de l'objet seront utilisées pour générer la liste des colonnes.

Disons que nous avons un objet avec de nombreuses propriétés, Quoi tonne d'eux, et nous ne voulons vraiment pas changer le Élément Excel objet à chaque fois que nous faisons un changement, nous avons créé un ColonneExcelItem tableau, qui sera utilisé pour générer ce Élément Excel.

Structure de la base de données

Nous sauvegardons cette définition dans notre base de données avec quelque chose comme ça:

emi20520ok-5435136

Notez que nous avons moins de valeurs que les propriétés existantes du Élément Excel objet, puisqu'il a 6 propriétés et nous n'avons que 3 inclus dans la base de données.

Notez également que Nom de la propriété il doit correspondre au nom de propriété de l'objet que j'utiliserai pour le mappage dynamique.

Construire l'objet

Maintenant que nous avons la table de base de données, nous devons construire le référentiel pour l'obtenir et pouvoir les utiliser dans le code.

je ne ferai pas de tuto pour cette partie, Je vais sauter au début du nouveau. Obtenir les octets Excel () une fonction.

emi20620ok-8578126

Maintenant, nous devrons créer un objet avec certaines des propriétés de Élément Excel, mais totalement dynamique. Au lieu d'utiliser le 6 Propriétés, nous utilisons seulement 3 d'elles, celui que nous voulons seulement envoyer.

Imaginez maintenant ceci Élément Excel l'objet a 200 Propriétés, agacé, mais ça peut arriver.

La seule chose que je dois faire est d'insérer les propriétés que je veux restituer dans le fichier excel dans ce ColonneExcelItem tableau et c'est tout.

Cas

Dans cette circonstance, nous n'utilisons qu'un seul cas, mais supposons que vous vouliez avoir des rapports différents pour certains utilisateurs. Disons que le la gestion le rôle doit obtenir toutes les propriétés, alors je créerais quelque chose comme cette structure dans la base de données.

emi20720ok-1815905

emi20820ok-6937663

Ensuite, quand je reçois le modèle, peut avoir des colonnes différentes, le tout dynamiquement et sans code associé.

Si nous avons un utilisateur avec le rôle Administrateurs, le fichier contiendra des colonnes Aller, Patate, Le nom, Âge, Créé en, Mis à jour dans.

Dans le cas où nous générons avec le Utilisateurs papier, qu'est-ce qu'il aura Pomme de terre, Âge. Le nom.

conclusion

C'est une excellente façon d'apprendre dynamique fonctionne en .NET et est une très bonne solution lorsque vous avez besoin d'avoir différents rôles ou modèles pour différents utilisateurs et que vous n'êtes pas vraiment intéressé à passer du temps à coder.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.