Créer automatiquement un Enum basé sur des valeurs dans une table de recherche de base de données?

116

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.

billfredtom
la source
Serait-il possible que vous essayiez d'utiliser une énumération d'une manière où il y a une meilleure solution?
Dan
Je suis avec @Dan, il doit y avoir une meilleure façon de faire ça.
N_A
@mydogisbox quel est le meilleur moyen?
eran otzap
@eranotzer En fait, après y avoir réfléchi un peu, il serait assez simple d'écrire une étape de pré-construction qui interroge la base de données et génère une énumération à partir de celle
N_A
1
Cela étant dit, je ne suis pas sûr de ce qu'il entend par "Je ne veux pas créer une énumération statique générée par du code", donc peut-être que cela ne correspond pas au besoin.
N_A

Réponses:

97

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:

// Get the current application domain for the current thread
AppDomain currentDomain = AppDomain.CurrentDomain;

// Create a dynamic assembly in the current application domain,
// and allow it to be executed and saved to disk.
AssemblyName name = new AssemblyName("MyEnums");
AssemblyBuilder assemblyBuilder = currentDomain.DefineDynamicAssembly(name,
                                      AssemblyBuilderAccess.RunAndSave);

// Define a dynamic module in "MyEnums" assembly.
// For a single-module assembly, the module has the same name as the assembly.
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(name.Name,
                                  name.Name + ".dll");

// Define a public enumeration with the name "MyEnum" and an underlying type of Integer.
EnumBuilder myEnum = moduleBuilder.DefineEnum("EnumeratedTypes.MyEnum",
                         TypeAttributes.Public, typeof(int));

// Get data from database
MyDataAdapter someAdapter = new MyDataAdapter();
MyDataSet.MyDataTable myData = myDataAdapter.GetMyData();

foreach (MyDataSet.MyDataRow row in myData.Rows)
{
    myEnum.DefineLiteral(row.Name, row.Key);
}

// Create the enum
myEnum.CreateType();

// Finally, save the assembly
assemblyBuilder.Save(name.Name + ".dll");

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!

Pandincus
la source
7
Pour ceux qui ne savent pas comment exécuter l'exécutable résultant sur post-build: 1) Cliquez avec le bouton droit sur le projet 2) Cliquez sur les propriétés 3) Cliquez sur Build Events 4) Dans le type de zone de texte "Post-build event command lines" $ (TargetPath)
Miguel
Est-il possible de faire Dynamic Enum avec une définition d'attribut personnalisé comme mentionné dans ce lien ?
Balagurunathan Marimuthu
49

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:

Le véritable pouvoir des énumérations en C # est que, dans les coulisses, ils sont instanciés en tant que structures dérivées de la classe de base, System.Enum. Cela signifie qu'il est possible d'appeler des méthodes contre elles pour effectuer des tâches utiles. Notez qu'en raison de la façon dont le .NET Framework est implémenté, il n'y a aucune perte de performances associée au traitement syntaxique des énumérations comme des structures. En pratique, une fois votre code compilé, les enums existeront en tant que types primitifs, tout comme int et float.

Donc, je ne suis pas sûr que vous puissiez utiliser Enums comme vous le souhaitez.

Marcus L
la source
1
Je ne sais pas quel est le raisonnement de billfredtom, mais le mien était que je pourrais éviter de faire des recherches de chaînes manuelles pour certaines clés, au lieu de les intégrer dans mon code. Je préfère simplement pouvoir exécuter la logique sur des valeurs fortement typées au lieu de chaînes faibles. Une mise en garde serait que, puisque nous avons maintenant du code qui repose sur un Enum généré dynamiquement, si nous supprimons la valeur de la base de données, la prochaine fois que nous essaierons de compiler notre code, cela échouera.
Pandincus
14
L'affiche et 18 votes positifs ont un peu manqué son point de vue. On dirait qu'il veut des énumérations générées , pas des énumérations dynamiques à l'exécution.
Matt Mitchell
+1. Une énumération est simplement une autre façon de définir des constantes entières (même si elle System.Enuma des fonctionnalités supplémentaires). Au lieu d'écrire, const int Red=0, Green=1, Blue=3;vous écrivez enum { Red, Green, Blue }. Une constante est par définition constante et non dynamique.
Olivier Jacot-Descombes
2
@Oliver Si vous voulez discuter de la sémantique, oui, vous avez raison. Mais je suis d'accord avec le commentaire de Graphain - je crois que l'OP recherche des énumérations générées . Il veut que les valeurs d'énumération proviennent de la base de données et ne doivent pas les coder en dur.
Pandincus
1
Ou ... disons que j'autorise quelqu'un dans mon web.config à définir des types de jetons pour les modèles de courrier électronique pour mon code de modèle de courrier électronique. Ce serait bien si mon énumération existante appelée EmailTokens qui représente ces types de chaînes serait générée en fonction de ces types définis dans mon web.config. Donc, si quelqu'un ajoute un nouveau jeton de messagerie dans le webconfig via ma valeur clé, par exemple "Email, FName" et que j'ai déjà une énumération que je vais utiliser pour représenter ces jetons tels que EmailTemplate.Email, ce serait bien si quelqu'un pouvait simplement ajouter un nouveau jeton de chaîne dans cette clé dans le web.config et mon énumération ajouterait automatiquement le const
PositiveGuy
18

Doit-il être une véritable énumération? Que diriez-vous d'utiliser un à la Dictionary<string,int>place?

par exemple

Dictionary<string, int> MyEnum = new Dictionary(){{"One", 1}, {"Two", 2}};
Console.WriteLine(MyEnum["One"]);
Autocrate
la source
11
Je n'essaierais pas de le faire de cette façon. Vous perdez vos vérifications de temps de compilation et devenez sujet aux erreurs de frappe. Tous les avantages des enums ont disparu. Vous pouvez introduire des constantes de chaîne, mais vous revenez là où vous avez commencé.
Daniel Brückner
1
Je suis d'accord. Mais rappelez-vous que les chaînes mal saisies seront interceptées lors de l'exécution. Ajoutez simplement un cas de test pour couvrir tous les membres d'énumération.
Autodidacte du
1
l'erreur de frappe n'est pas un problème si vous utilisez des constantes au lieu de littéraux
Maslow
@Maslow Supposons que vous vouliez dire des énumérations, pas des constantes de chaîne.
Matt Mitchell
4
+1. L'utilisation d'un dictionnaire ou d'un HashSet se rapproche le plus de ce qui pourrait être une énumération dynamique. Entièrement dynamique signifie que cela se produit au moment de l'exécution et par conséquent, la vérification des erreurs devra se produire au moment de l'exécution.
Olivier Jacot-Descombes
13

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.

Codage avec Spike
la source
12

Disons que vous avez les éléments suivants dans votre base de données:

table enums
-----------------
| id | name     |
-----------------
| 0  | MyEnum   |
| 1  | YourEnum |
-----------------

table enum_values
----------------------------------
| id | enums_id | value | key    |
----------------------------------
| 0  | 0        | 0     | Apple  |
| 1  | 0        | 1     | Banana |
| 2  | 0        | 2     | Pear   |
| 3  | 0        | 3     | Cherry |
| 4  | 1        | 0     | Red    |
| 5  | 1        | 1     | Green  |
| 6  | 1        | 2     | Yellow |
----------------------------------

Construisez une sélection pour obtenir les valeurs dont vous avez besoin:

select * from enums e inner join enum_values ev on ev.enums_id=e.id where e.id=0

Construisez le code source de l'énumération et vous obtiendrez quelque chose comme:

String enumSourceCode = "enum " + enumName + "{" + enumKey1 + "=" enumValue1 + "," + enumKey2 + ... + "}";

(évidemment, cela est construit dans une boucle quelconque.)

Vient ensuite la partie amusante, compiler votre énumération et l'utiliser:

CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cs = new CompilerParameters();
cp.GenerateInMemory = True;

CompilerResult result = provider.CompileAssemblyFromSource(cp, enumSourceCode);

Type enumType = result.CompiledAssembly.GetType(enumName);

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:

[Enum].Parse(enumType, value);

où valeur peut être la valeur entière (0, 1, etc.) ou le texte / clé d'énumération (Apple, Banana, etc.)

Sani Singh Huttunen
la source
4
En quoi cela aiderait-il réellement? Il n'y a pas de sécurité de type et pas d'intellisense. En gros, ce n'est qu'une manière plus compliquée d'utiliser une constante car il doit de toute façon fournir la valeur.
Runeborg
2
Sani - parfait! C'était exactement ce dont j'avais besoin. Pour ceux qui remettent en question la raison de quelque chose comme ça, j'utilise une bibliothèque de fournisseur qui nécessite qu'une propriété soit définie sur le nom d'une énumération. L'énumération limite la plage de valeurs valides pour une propriété différente du même objet. Dans mon cas, je charge des métadonnées, y compris la plage de valeurs valides d'une base de données; et non, le code du fournisseur ne prend pas en charge le passage d'une collection de tout type à la propriété. Merci
10

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:

USE [ocms_dev]
    GO

CREATE TABLE [dbo].[Role](
    [RoleId] [int] IDENTITY(1,1) NOT NULL,
    [RoleName] [varchar](50) NULL
) ON [PRIMARY]

Voici donc le programme de la console produisant la dll:

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System.Data.Common;
using System.Data;
using System.Data.SqlClient;

namespace DynamicEnums
{
    class EnumCreator
    {
        // after running for first time rename this method to Main1
        static void Main ()
        {
            string strAssemblyName = "MyEnums";
            bool flagFileExists = System.IO.File.Exists (
                   AppDomain.CurrentDomain.SetupInformation.ApplicationBase + 
                   strAssemblyName + ".dll"
            );

            // Get the current application domain for the current thread
            AppDomain currentDomain = AppDomain.CurrentDomain;

            // Create a dynamic assembly in the current application domain,
            // and allow it to be executed and saved to disk.
            AssemblyName name = new AssemblyName ( strAssemblyName );
            AssemblyBuilder assemblyBuilder = 
                    currentDomain.DefineDynamicAssembly ( name,
                            AssemblyBuilderAccess.RunAndSave );

            // Define a dynamic module in "MyEnums" assembly.
            // For a single-module assembly, the module has the same name as
            // the assembly.
            ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule (
                    name.Name, name.Name + ".dll" );

            // Define a public enumeration with the name "MyEnum" and
            // an underlying type of Integer.
            EnumBuilder myEnum = moduleBuilder.DefineEnum (
                    "EnumeratedTypes.MyEnum",
                    TypeAttributes.Public,
                    typeof ( int )
            );

            #region GetTheDataFromTheDatabase
            DataTable tableData = new DataTable ( "enumSourceDataTable" );

            string connectionString = "Integrated Security=SSPI;Persist " +
                    "Security Info=False;Initial Catalog=ocms_dev;Data " +
                    "Source=ysg";

            using (SqlConnection connection = 
                    new SqlConnection ( connectionString ))
            {

                SqlCommand command = connection.CreateCommand ();
                command.CommandText = string.Format ( "SELECT [RoleId], " + 
                        "[RoleName] FROM [ocms_dev].[dbo].[Role]" );

                Console.WriteLine ( "command.CommandText is " + 
                        command.CommandText );

                connection.Open ();
                tableData.Load ( command.ExecuteReader ( 
                        CommandBehavior.CloseConnection
                ) );
            } //eof using

            foreach (DataRow dr in tableData.Rows)
            {
                myEnum.DefineLiteral ( dr[1].ToString (),
                        Convert.ToInt32 ( dr[0].ToString () ) );
            }
            #endregion GetTheDataFromTheDatabase

            // Create the enum
            myEnum.CreateType ();

            // Finally, save the assembly
            assemblyBuilder.Save ( name.Name + ".dll" );
        } //eof Main 
    } //eof Program
} //eof namespace 

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.

// add the reference to the newly generated dll
use MyEnums ; 

class Program
{
    static void Main ()
    {
        Array values = Enum.GetValues ( typeof ( EnumeratedTypes.MyEnum ) );

        foreach (EnumeratedTypes.MyEnum val in values)
        {
            Console.WriteLine ( String.Format ( "{0}: {1}",
                    Enum.GetName ( typeof ( EnumeratedTypes.MyEnum ), val ),
                    val ) );
        }

        Console.WriteLine ( "Hit enter to exit " );
        Console.ReadLine ();
    } //eof Main 
} //eof Program
Yordan Georgiev
la source
1
@YordanGeorgiev -Pourquoi déclarez-vous flagFileExistsquand il n'est utilisé nulle part ailleurs dans l'application?
Michael Kniskern
2
Je suppose que c'est un bug que; I)
Yordan Georgiev
5

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?

Brian Lowe
la source
Oui et non, oui parce que vous avez raison, tout le point est que l'énumération est statique. Vous pouvez éviter les erreurs de frappe et savoir ce qui est disponible. Avec dictionnaire et db - pourrait être n'importe quoi. Mais parfois, vous voulez les fruits des deux arbres alors que vous n'êtes autorisé à en choisir qu'un.
Ken
4

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:

public abstract class CustomEnum
{
    private readonly string _name;
    private readonly object _id;

    protected CustomEnum( string name, object id )
    {
        _name = name;
        _id = id;
    }

    public string Name
    {
        get { return _name; }
    }

    public object Id
    {
        get { return _id; }
    }

    public override string ToString()
    {
        return _name;
    }
}

public abstract class CustomEnum<TEnumType, TIdType> : CustomEnum
    where TEnumType : CustomEnum<TEnumType, TIdType>
{
    protected CustomEnum( string name, TIdType id )
        : base( name, id )
    { }

    public new TIdType Id
    {
        get { return (TIdType)base.Id; }
    }

    public static TEnumType FromName( string name )
    {
        try
        {
            return FromDelegate( entry => entry.Name.Equals( name ) );
        }
        catch (ArgumentException ae)
        {
            throw new ArgumentException( "Illegal name for custom enum '" + typeof( TEnumType ).Name + "'", ae );
        }
    }

    public static TEnumType FromId( TIdType id )
    {
        try
        {
            return FromDelegate( entry => entry.Id.Equals( id ) );
        }
        catch (ArgumentException ae)
        {
            throw new ArgumentException( "Illegal id for custom enum '" + typeof( TEnumType ).Name + "'", ae );
        }
    }

    public static IEnumerable<TEnumType> GetAll()
    {
        var elements = new Collection<TEnumType>();
        var infoArray = typeof( TEnumType ).GetFields( BindingFlags.Public | BindingFlags.Static );

        foreach (var info in infoArray)
        {
            var type = info.GetValue( null ) as TEnumType;
            elements.Add( type );
        }

        return elements;
    }

    protected static TEnumType FromDelegate( Predicate<TEnumType> predicate )
    {
        if(predicate == null)
            throw new ArgumentNullException( "predicate" );

        foreach (var entry in GetAll())
        {
            if (predicate( entry ))
                return entry;
        }

        throw new ArgumentException( "Element not found while using predicate" );
    }
}

Maintenant, j'ai juste besoin de créer mon énumération que je veux utiliser:

 public sealed class SampleEnum : CustomEnum<SampleEnum, int>
    {
        public static readonly SampleEnum Element1 = new SampleEnum( "Element1", 1, "foo" );
        public static readonly SampleEnum Element2 = new SampleEnum( "Element2", 2, "bar" );

        private SampleEnum( string name, int id, string additionalText )
            : base( name, id )
        {
            AdditionalText = additionalText;
        }

        public string AdditionalText { get; private set; }
    }

Enfin je peux l'utiliser comme je veux:

 static void Main( string[] args )
        {
            foreach (var element in SampleEnum.GetAll())
            {
                Console.WriteLine( "{0}: {1}", element, element.AdditionalText );
                Console.WriteLine( "Is 'Element2': {0}", element == SampleEnum.Element2 );
                Console.WriteLine();
            }

            Console.ReadKey();
        }

Et ma sortie serait:

Element1: foo
Is 'Element2': False

Element2: bar
Is 'Element2': True    
Traummaennlein
la source
2

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.

Binaire Worrier
la source
0

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.

Runeborg
la source
0

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?

Martin
la source
0

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.

Get integer from database
If Integer is in Enum -> create Enum -> then run Enum parts
If Integer is not a Enum -> create Dictionary from Table -> then run Dictionary parts.
Jackstine
la source
0

classe de générateur enum

public class XEnum
{
    private EnumBuilder enumBuilder;
    private int index;
    private AssemblyBuilder _ab;
    private AssemblyName _name;
    public XEnum(string enumname)
    {
        AppDomain currentDomain = AppDomain.CurrentDomain;
        _name = new AssemblyName("MyAssembly");
        _ab = currentDomain.DefineDynamicAssembly(
            _name, AssemblyBuilderAccess.RunAndSave);

        ModuleBuilder mb = _ab.DefineDynamicModule("MyModule");

        enumBuilder = mb.DefineEnum(enumname, TypeAttributes.Public, typeof(int));


    }
    /// <summary>
    /// adding one string to enum
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    public FieldBuilder add(string s)
    {
        FieldBuilder f = enumBuilder.DefineLiteral(s, index);
        index++;
        return f;
    }
    /// <summary>
    /// adding array to enum
    /// </summary>
    /// <param name="s"></param>
    public void addRange(string[] s)
    {
        for (int i = 0; i < s.Length; i++)
        {
            enumBuilder.DefineLiteral(s[i], i);
        }
    }
    /// <summary>
    /// getting index 0
    /// </summary>
    /// <returns></returns>
    public object getEnum()
    {
        Type finished = enumBuilder.CreateType();
        _ab.Save(_name.Name + ".dll");
        Object o1 = Enum.Parse(finished, "0");
        return o1;
    }
    /// <summary>
    /// getting with index
    /// </summary>
    /// <param name="i"></param>
    /// <returns></returns>
    public object getEnum(int i)
    {
        Type finished = enumBuilder.CreateType();
        _ab.Save(_name.Name + ".dll");
        Object o1 = Enum.Parse(finished, i.ToString());
        return o1;
    }
}

créer un objet

string[] types = { "String", "Boolean", "Int32", "Enum", "Point", "Thickness", "long", "float" };
XEnum xe = new XEnum("Enum");
        xe.addRange(types);
        return xe.getEnum();
Mahdi Khalili
la source