C# 如何在使用EnumBuilder动态创建枚举时设置属性

C# 如何在使用EnumBuilder动态创建枚举时设置属性,c#,xml,enums,C#,Xml,Enums,我必须从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&g

我必须从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>
我想创建如下所示的枚举:

[DataContract]
[Flags]
public enum Category
{
    [EnumMember]
    Tekken = 10,
    [EnumMember]
    NFS = 20,
    [EnumMember]
    FinalFa = 40,
}
Type myType = typeof(DataContract);
ConstructorInfo myInfo = myType.GetConstructor();

eb.SetCustomAttribute(myInfo);
到目前为止,我已经能够创建以下内容:

 public enum Category
    {
        Tekken = 10,
        NFS = 20,
        FinalFa = 40,
    }
用于生成枚举的C代码:

   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]添加到我的枚举中?

如您所见,
DefineLiteral
方法返回一个
FieldBuilder
(fb1、fb2、fb3)。可以在FieldBuilder上使用设置属性。链接的MSDN文章有一个关于如何使用它的示例。不过,它的要点是,使用a来构建属性,然后将其交给SetCustomAttribute。

不完全确定,但类似以下内容:

[DataContract]
[Flags]
public enum Category
{
    [EnumMember]
    Tekken = 10,
    [EnumMember]
    NFS = 20,
    [EnumMember]
    FinalFa = 40,
}
Type myType = typeof(DataContract);
ConstructorInfo myInfo = myType.GetConstructor();

eb.SetCustomAttribute(myInfo);

我尝试了这种方法,在设置属性之后,我创建了EnumAssembly dll。然后我在另一个项目中引用了这个dll,并检查了这个枚举的元数据(转到定义F12)。但是属性[EnumMember]不可见。我在这里遗漏了什么吗?我遗漏了添加命名空间System.Runtime.Serialization。添加后,[EnumMember]属性可见。