2014-10-09 265 views
1

我必须从XML动态创建Enum。 XML格式如下:如何使用EnumBuilder动态创建枚举时设置属性

<?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, 
} 

到目前为止,我已经能够创造这样的:

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

回答

0

如您所见,DefineLiteral方法返回FieldBuilder(fb1,fb2,fb3)。您可以在FieldBuilder上使用SetCustomAttribute来设置属性。链接的MSDN文章中有一个关于如何使用它的例子。它的要点虽然,将使用CustomAttributeBuilder建立你的属性,然后把它给SetCustomAttribute。

+0

我试过这种方法,并设置属性后,我创建EnumAssembly DLL。然后我在另一个项目中引用了这个dll,并检查了这个枚举的元数据(转到定义F12)。但是[EnumMember]属性不可见。我在这里错过了什么吗? – Vaibhav 2014-10-09 13:24:50

+0

我错过了添加命名空间System.Runtime.Serialization。添加后[EnumMember]属性可见。 – Vaibhav 2014-12-16 04:30:37

0

不完全肯定,但这样的事情:

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

eb.SetCustomAttribute(myInfo);