Подтвердить что ты не робот

Динамически создать перечисление

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Надеюсь, что поможет