使用.NET的CodeDom创建枚举

我想使用CodeDom API创建一个Enumeration。 我在互联网上搜索得足够多,我得到的结果几乎没用。

我想要产生的是

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

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

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