Comment créer automatiquement une énumération et utiliser ensuite ses valeurs en C # en fonction des valeurs d'une table de recherche de base de données (à l'aide de la couche de données de la bibliothèque d'entreprise)?
Par exemple, si j'ajoute une nouvelle valeur de recherche dans la base de données, je ne veux pas avoir à ajouter manuellement la déclaration de valeur d'énumération statique supplémentaire dans le code - j'aimerais garder l'énumération synchronisée avec la base de données.
Existe-t-il une telle chose?
Je ne veux pas créer une énumération statique générée par du code (selon l' article du projet de code Enum Code Generator - Génération automatique de code énumération à partir de tables de recherche de base de données ) et je préférerais qu'elle soit complètement automatique.
Réponses:
Je fais exactement cette chose, mais vous devez faire une sorte de génération de code pour que cela fonctionne.
Dans ma solution, j'ai ajouté un projet "EnumeratedTypes". Il s'agit d'une application console qui récupère toutes les valeurs de la base de données et en construit les énumérations. Ensuite, il enregistre toutes les énumérations dans un assemblage.
Le code de génération enum est comme ceci:
Mes autres projets dans la solution font référence à cet assembly généré. En conséquence, je peux ensuite utiliser les énumérations dynamiques dans le code, avec intellisense.
Ensuite, j'ai ajouté un événement post-build pour qu'après la construction de ce projet "EnumeratedTypes", il s'exécute et génère le fichier "MyEnums.dll".
En passant, cela permet de modifier l' ordre de génération de votre projet afin que "EnumeratedTypes" soit généré en premier. Sinon, une fois que vous commencez à utiliser votre .dll généré dynamiquement, vous ne pourrez pas faire de compilation si le .dll est supprimé. (Type de problème de poulet et d'oeuf - vos autres projets dans la solution ont besoin de ce .dll pour se construire correctement, et vous ne pouvez pas créer le .dll tant que vous n'avez pas créé votre solution ...)
J'ai obtenu la plupart du code ci-dessus de cet article msdn .
J'espère que cela t'aides!
la source
Les énumérations doivent être spécifiées au moment de la compilation, vous ne pouvez pas ajouter dynamiquement des énumérations pendant l'exécution - et pourquoi le feriez-vous, il n'y aurait aucune utilisation / référence à eux dans le code?
À partir de Professional C # 2008:
Donc, je ne suis pas sûr que vous puissiez utiliser Enums comme vous le souhaitez.
la source
System.Enum
a des fonctionnalités supplémentaires). Au lieu d'écrire,const int Red=0, Green=1, Blue=3;
vous écrivezenum { Red, Green, Blue }
. Une constante est par définition constante et non dynamique.Doit-il être une véritable énumération? Que diriez-vous d'utiliser un à la
Dictionary<string,int>
place?par exemple
la source
J'ai fait cela avec un modèle T4 . Il est assez simple de déposer un fichier .tt dans votre projet et de configurer Visual Studio pour exécuter le modèle T4 en tant qu'étape de pré-génération.
Le T4 génère un fichier .cs, ce qui signifie que vous pouvez simplement le demander à la base de données et créer une énumération dans un fichier .cs à partir du résultat. Câblé en tant que tâche de pré-construction, il recréerait votre énumération à chaque construction, ou vous pouvez exécuter le T4 manuellement si nécessaire à la place.
la source
Disons que vous avez les éléments suivants dans votre base de données:
Construisez une sélection pour obtenir les valeurs dont vous avez besoin:
Construisez le code source de l'énumération et vous obtiendrez quelque chose comme:
(évidemment, cela est construit dans une boucle quelconque.)
Vient ensuite la partie amusante, compiler votre énumération et l'utiliser:
Vous avez maintenant le type compilé et prêt à être utilisé.
Pour obtenir une valeur d'énumération stockée dans la base de données, vous pouvez utiliser:
où valeur peut être la valeur entière (0, 1, etc.) ou le texte / clé d'énumération (Apple, Banana, etc.)
la source
Juste en montrant la réponse de Pandincus avec le code "de l'étagère" et quelques explications: Vous avez besoin de deux solutions pour cet exemple (je sais que cela pourrait être fait via une aussi;), laissez les étudiants avancés le présenter ...
Voici donc le DDL SQL de la table:
Voici donc le programme de la console produisant la dll:
Voici la programmation de la console imprimant la sortie (rappelez-vous qu'elle doit référencer la dll). Laissez les étudiants avancés présenter la solution pour combiner tout dans une seule solution avec un chargement dynamique et vérifier s'il existe déjà une DLL de construction.
la source
flagFileExists
quand il n'est utilisé nulle part ailleurs dans l'application?N'y arrivons-nous pas de la mauvaise direction?
Si les données sont susceptibles de changer pendant la durée de vie de la version déployée, une énumération n'est tout simplement pas appropriée et vous devez utiliser un dictionnaire, un hachage ou une autre collection dynamique.
Si vous savez que l'ensemble des valeurs possibles est fixe pour la durée de vie de la version déployée, une énumération est préférable.
Si vous devez avoir quelque chose dans votre base de données qui réplique l'ensemble énuméré, alors pourquoi ne pas ajouter une étape de déploiement pour effacer et remplir à nouveau la table de base de données avec l'ensemble définitif de valeurs d'énumération?
la source
J'aime toujours écrire mon propre "enum personnalisé". Ensuite, j'ai une classe qui est un peu plus complexe, mais je peux la réutiliser:
Maintenant, j'ai juste besoin de créer mon énumération que je veux utiliser:
Enfin je peux l'utiliser comme je veux:
Et ma sortie serait:
la source
Vous voulez System.Web.Compilation.BuildProvider
Je doute également de la sagesse de faire cela, mais il y a peut-être un bon cas d'utilisation auquel je ne peux pas penser.
Ce que vous recherchez, ce sont des fournisseurs de build, à savoir System.Web.Compilation.BuildProvider
Ils sont utilisés très efficacement par SubSonic , vous pouvez télécharger la source et voir comment ils les utilisent, vous n'aurez besoin de rien d'aussi complexe que ce qu'ils font.
J'espère que cela t'aides.
la source
Vous pouvez utiliser CodeSmith pour générer quelque chose comme ceci:
http://www.csharping.com/PermaLink,guid,cef1b637-7d37-4691-8e49-138cbf1d51e9.aspx
la source
Je ne pense pas qu'il y ait une bonne façon de faire ce que vous voulez. Et si vous y réfléchissez, je ne pense pas que ce soit ce que vous voulez vraiment.
Si vous avez une énumération dynamique, cela signifie également que vous devez l'alimenter avec une valeur dynamique lorsque vous la référencez. Peut-être qu'avec beaucoup de magie, vous pourriez obtenir une sorte d' IntelliSense qui s'occuperait de cela et générerait une énumération pour vous dans un fichier DLL. Mais considérez la quantité de travail qu'il faudrait, à quel point il serait inefficace d'accéder à la base de données pour récupérer les informations IntelliSense ainsi que le cauchemar de la version contrôlant le fichier DLL généré.
Si vous ne voulez vraiment pas ajouter manuellement les valeurs d'énumération (vous devrez de toute façon les ajouter à la base de données), utilisez plutôt un outil de génération de code, par exemple des modèles T4 . Faites un clic droit + exécutez et vous obtenez votre énumération définie statiquement dans le code et vous obtenez tous les avantages de l'utilisation des énumérations.
la source
L'utilisation d'énumérations dynamiques est mauvaise quelle que soit la manière. Vous devrez passer par la peine de "dupliquer" les données pour assurer un code clair et facile à maintenir dans le futur.
Si vous commencez à introduire des bibliothèques générées automatiquement, vous causez certainement plus de confusion aux futurs développeurs devant mettre à jour votre code que de simplement coder votre énumération dans l'objet de classe approprié.
Les autres exemples donnés semblent beaux et passionnants, mais pensez à la surcharge de la maintenance du code par rapport à ce que vous en retirez. De plus, ces valeurs vont-elles changer aussi fréquemment?
la source
Une façon de conserver les énumérations et de créer une liste dynamique de valeurs en même temps consiste à utiliser les énumérations que vous avez actuellement avec un dictionnaire créé dynamiquement.
Étant donné que la plupart des Enums sont utilisés dans le contexte dans lequel ils sont définis pour être utilisés, et que les "énumérations dynamiques" seront prises en charge par des processus dynamiques, vous pouvez distinguer les 2.
La première étape consiste à créer une table / collection qui héberge les ID et les références pour les entrées dynamiques. Dans le tableau, vous incrémenterez automatiquement beaucoup plus que votre plus grande valeur Enum.
Vient maintenant la partie pour vos Enums dynamiques, je suppose que vous utiliserez les Enums pour créer un ensemble de conditions qui appliquent un ensemble de règles, certaines sont générées dynamiquement.
la source
classe de générateur enum
créer un objet
la source