C# 如何在使用EnumBuilder动态创建枚举时设置属性
我必须从XML动态创建枚举。 XML格式如下: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 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]属性可见。