Как установить атрибуты при динамическом создании enum с помощью EnumBuilder

1

Я должен динамически создавать Enum из XML. Формат XML выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<Category xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Game>
    <Name>Tekken</Name>
    <Code>10</Code>
  </Game>
  <Game>
    <Name>NFS</Name>
    <Code>20</Code>
  </Game>
  <Game>
    <Name>FinalFa</Name>
    <Code>40</Code>
  </Game>
</Category>

Я хочу создать Enum, который выглядит так:

[DataContract]
[Flags]
public enum Category
{
    [EnumMember]
    Tekken = 10,
    [EnumMember]
    NFS = 20,
    [EnumMember]
    FinalFa = 40,
}

До сих пор я смог создать это:

 public enum Category
    {
        Tekken = 10,
        NFS = 20,
        FinalFa = 40,
    }

Код С#, используемый для генерации Enum:

   private static void Create()
        {
            AppDomain currentDomain = AppDomain.CurrentDomain;
            AssemblyName asmName = new AssemblyName("EnumAssembly");
            AssemblyBuilder asmBuilder = currentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.RunAndSave);
            ModuleBuilder mb = asmBuilder.DefineDynamicModule(asmName.Name, asmName.Name + ".dll");
            EnumBuilder eb = mb.DefineEnum("MyNamespace.Category", TypeAttributes.Public, typeof(int));

            FieldBuilder fb1 = eb.DefineLiteral("Tekken", 10);
            FieldBuilder fb2 = eb.DefineLiteral("NFS", 20);
            FieldBuilder fb3 = eb.DefineLiteral("FinalFa", 40);

            Type eType = eb.CreateType();
            asmBuilder.Save(asmName.Name + ".dll");

            foreach (object obj in Enum.GetValues(eType))
            {
                Console.WriteLine("{0}.{1} = {2}", eType, obj, ((int)obj));
            }
        }

Как добавить атрибуты [DataContract], [Flags] и [EnumMember] к моему перечислению?

Теги:
enums

2 ответа

0
Лучший ответ

Как вы видите, метод DefineLiteral возвращает FieldBuilder (fb1, fb2, fb3). Вы можете использовать SetCustomAttribute в FieldBuilder для установки атрибута. Связанная статья MSDN содержит пример того, как ее использовать. Суть его заключается в том, чтобы использовать CustomAttributeBuilder для создания вашего атрибута, а затем передать его в SetCustomAttribute.

  • 0
    Я попробовал этот подход и после установки атрибутов я создал EnumAssembly dll. Затем я сослался на эту DLL в другом проекте и проверил метаданные для этого перечисления (Перейти к определению F12). Но атрибут [EnumMember] не был виден. Я что-то здесь упускаю?
  • 0
    Я пропустил добавление пространства имен System.Runtime.Serialization. После добавления его атрибут [EnumMember] был виден.
0

Не совсем уверен, но что-то вроде этого:

Type myType = typeof(DataContract);
ConstructorInfo myInfo = myType.GetConstructor();

eb.SetCustomAttribute(myInfo);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню