2009-05-13 4 views
27

У меня есть перечисление следующего stucture:Динамически создать перечисление

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

Я использую это перечисление, чтобы получить имена и значения. Поскольку существует требование добавить больше типов, мне нужно прочитать тип и значения из файла XML. Есть ли способ, с помощью которого я могу динамически создать это перечисление из файла XML, чтобы сохранить структуру программы.

ответ

42

Возможно, вы должны использовать вместо этого Dictionary<string, int>.

Если вы хотите, чтобы создать enum на время компиляции динамически, вы можете рассмотреть T4.

+1

я согласен. Все ссылки на отдельные значения перечисления преобразуются в числовые литералы во время компиляции. Это может создать потенциальные проблемы с версиями. Однако это невозможно. Где-то я читаю, что CodeDom может вам помочь, но помните, что это большая работа. Не уверен, что это поможет. – Prithis

+0

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

26

Используйте EnumBuilder для динамического создания перечислений. Это потребует использования Reflection.

ШАГ 1: СОЗДАНИЕ ENUM ИСПОЛЬЗОВАНИЕ СБОРКА/ENUM СТРОИТЕЛЬ

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

ШАГ 2: ИСПОЛЬЗОВАНИЕ Созданное ENUM

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

Надежда, что помогает

+0

Удивительный !!! я не знал, что вы можете создать сборку во время выполнения –

+0

Да, но как я могу пообещать, что это перечисление будет существовать для успешного создания моего приложения? – kuskmen

+0

Я знаю, что это немного запоздало, но, поскольку этот дублированный другой пост, я отвечу на вопрос кускмена: вы этого не делаете. Вы генерируете типы в _runtime_. – john

Смежные вопросы