使用.NET的CodeDom创建枚举类型

12

我想使用 CodeDom API 创建一个枚举。我在互联网上进行了足够的搜索,但获得的结果几乎没有用。

我想要生成的是:

public enum bug_tracker_type
{
    [Description("Bugzilla")]
    Bugzilla,
    [Description("Debbugs")]
    Debbugs,
    [Description("PHP Project Bugtracker")]
    PHP_Project_Bugtracker,
    [Description("Google Code")]
    Google_Code
}

我使用了 CodeTypeDeclaration 并将其 IsEnum 属性设置为 true,创建了一个名称,并设置了它的属性。

现在最大的问题是如何填充枚举的内容?

我尝试过:

CodeTypeMember mem = new CodeTypeMember();
mem.Name = WadlSharpUtils.CreateIdentifier(discreteValue.value);
mem.CustomAttributes.Add(new CodeAttributeDeclaration(discreteValue.value));
// enumCandidate is an instance of CodeTypeDeclaration
enumCandidate.Members.Add(mem);
尽管使用这个解决方案我能生成描述属性,但是行尾会是";"而不是","。
1个回答

20

枚举成员是字段,因此应使用CodeMemberField:

CodeTypeDeclaration type = new CodeTypeDeclaration("BugTracker");
type.IsEnum = true;

foreach (var valueName in new string[] { "Bugzilla", "Redmine" })
{
  // Creates the enum member
  CodeMemberField f = new CodeMemberField("BugTracker", valueName);
  // Adds the description attribute
  f.CustomAttributes.Add(new CodeAttributeDeclaration("Description", new CodeAttributeArgument(new CodePrimitiveExpression(valueName))));

  type.Members.Add(f);
}

(在这个简化的代码中,描述(Description)将始终与成员名称相同。当然,在您的实际代码中,它们可能不同。)

你可能会注意到一个小怪癖,那就是CodeDom在最后一个枚举值后添加了一个逗号:

public enum BugTracker {

    [Description("Bugzilla")]
    Bugzilla,

    [Description("Redmine")]
    Redmine,                         // trailing comma
}

这是C#语言允许的,目的是为了支持生成代码等场景,即使对人类阅读者来说可能有些奇怪,但编译仍然可以正常进行。


说得好 - 枚举实际上是 CodeMemberField 的一种类型并不是特别明显。在其他情况下非常有用的信息! - AJ.
同意,说得非常好。枚举的值是字段的事实可能源于它们在 .Net 二进制文件中实际存储的方式,即一组具有常量值的静态字段。 - Orvid King
如何通过Codedom分配枚举值?例如,Bugzilla=1,Redmine=2等。 - Corey Alix
使用InitExpression(例如f.InitExpression = new CodePrimitiveExpression(value)); - Corey Alix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接