2009-05-13 17 views
27

Ich habe eine Enumeration der folgenden stucture:dynamisch eine ENUM erstellen

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

ich dieses Enum bin mit den Namen und die Werte zu erhalten. Da weitere Typen hinzugefügt werden müssen, muss der Typ und die Werte aus einer XML-Datei gelesen werden. Gibt es eine Möglichkeit, wie ich diese Enumeration dynamisch aus XML-Datei erstellen kann, so dass ich die Programmstruktur beibehalten kann.

Antwort

42

Wahrscheinlich sollten Sie stattdessen eine Dictionary<string, int> verwenden.

Wenn Sie die enum bei Kompilierung- dynamisch generieren möchten, können Sie T4 zu betrachten.

+1

hilft Ich bin damit einverstanden. Alle Verweise auf die einzelnen Werte einer Enumeration werden zur Kompilierzeit in numerische Literale konvertiert. Dies kann zu Problemen bei der Versionssteuerung führen. Es ist jedoch nicht unmöglich. Irgendwo habe ich gelesen CodeDom kann Ihnen helfen, aber bewusst sein, es ist viel Arbeit. Nicht sicher, ob es die Mühe geht. – Prithis

+0

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

26

Verwenden Sie EnumBuilder, um Enums dynamisch zu erstellen. Dies würde die Verwendung von Reflection erfordern.

Schritt 1: Erstellen Sie ENUM verwenden MONTAGE/ENUM BUILDER

// 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"); 

SCHRITT 2: VERWENDUNG DER ERSTELLT ENUM

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

Hoffnung, die

+0

Erstaunlich !!! Ich wusste nicht, dass Sie eine Assembly zur Laufzeit erstellen können. –

+0

Ja, aber wie kann ich versprechen, dass diese Enumeration existieren wird, um meine Anwendung erfolgreich zu erstellen? – kuskmen

+0

Ich weiß, das ist ein bisschen spät, aber da dies einen anderen Beitrag dupliziert, werde ich kuskmens Frage beantworten: Sie nicht. Sie generieren die Typen bei _runtime_. – john