2009-05-13 36 views
27

tengo una enumeración de las siguientes stucture:crear dinámicamente una enumeración

public enum DType 
{  
    LMS = 0, 
    DNP = -9, 
    TSP = -2, 
    ONM = 5, 
    DLS =9, 
    NDS = 1 
} 

estoy usando esta enumeración para obtener los nombres y los valores. Dado que hay un requisito para agregar más tipos, necesito leer el tipo y los valores de un archivo XML. ¿Hay alguna manera por la cual puedo crear esta enumeración de forma dinámica a partir de un archivo XML para que pueda conservar la estructura del programa?

Respuesta

42

Probablemente, debería considerar usar un Dictionary<string, int> en su lugar.

Si desea generar el enum en tiempo de compilación forma dinámica, es posible que desee considerar T4.

+1

estoy de acuerdo. Todas las referencias a los valores individuales de una enumeración se convierten a literales numéricos en tiempo de compilación. Esto puede crear posibles problemas de control de versiones. Sin embargo, no es imposible. En algún lugar que leo CodeDom puede ayudarte, pero ten en cuenta que es mucho trabajo. No estoy seguro de si le preocupa el esfuerzo. – Prithis

+0

+1 para [T4] (http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx) – elimad

26

Utilice EnumBuilder para crear enums dinámicamente. Esto requeriría el uso de Reflection.

PASO 1: CREAR ENUM USO DE MONTAJE/ENUM CONSTRUCTOR

// 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 aName = new AssemblyName("TempAssembly"); 
AssemblyBuilder ab = currentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.RunAndSave); 

// Define a dynamic module in "TempAssembly" assembly. For a single- 
// module assembly, the module has the same name as the assembly. 
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll"); 

// Define a public enumeration with the name "Elevation" and an 
// underlying type of Integer. 
EnumBuilder eb = mb.DefineEnum("Elevation", TypeAttributes.Public, typeof(int)); 

// Define two members, "High" and "Low". 
eb.DefineLiteral("Low", 0); 
eb.DefineLiteral("High", 1); 

// Create the type and save the assembly. 
Type finished = eb.CreateType(); 
ab.Save(aName.Name + ".dll"); 

PASO 2: EL USO DEL ENUM CREADO

System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFrom("TempAssembly.dll"); 
System.Type enumTest = ass.GetType("Elevation"); 
string[] values = enumTest .GetEnumNames(); 

Espero que ayude

+0

¡Increíble! No sabía que podía crear un ensamblado en tiempo de ejecución –

+0

Sí, pero ¿cómo puedo prometer que esta enumeración existirá para construir mi aplicación con éxito? – kuskmen

+0

Sé que esto es un poco tarde, pero como esto duplicó otra publicación, responderé la pregunta de kuskmen: no es así. Estás generando los tipos en _runtime_. – john