11

我想使用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,创建了一个名称,并将其设置为属性。

现在最大的问题是如何填充body?

我试过了

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);

虽然使用这个解决方案我可以生成描述属性,但行尾是;而不是,

4

1 回答 1

19

枚举成员是字段,所以使用 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# 语言允许的,正是为了支持这样的生成代码场景,并且即使在人类读者看来有点奇怪,它也能很好地编译。

于 2010-04-17T07:33:52.533 回答