12

I want to create an Enumeration using CodeDom API. I have searched enough on the internet and I get results which are hardly of any use.

What I want to generate is

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

I used CodeTypeDeclaration and set it's IsEnum property as true, created a name, and set it's Attributes.

Now the biggest problem is how to populate the body?

I tried

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

Though using this solution I can generate the Description attributes, the end of line would be ; and not ,

Manish Sinha
  • 2,092
  • 2
  • 22
  • 33

1 Answers1

20

Enum members are fields, so use 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);
}

(In this simplified code, the Description will always be the same as the member name. In your real code, of course, these can be different.)

A little quirk you may notice is that CodeDom adds a comma after the last enum value:

public enum BugTracker {

    [Description("Bugzilla")]
    Bugzilla,

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

This is permitted by the C# language, precisely in order to support generated-code scenarios like this, and will compile fine even if it looks a bit odd to the human reader.

itowlson
  • 73,686
  • 17
  • 161
  • 157
  • Nicely put - it isn't particularly obvious that enums are in fact a type of CodeMemberField. Useful information in other contexts! – AJ. Apr 20 '11 at 15:14
  • Agreed, very nicely put. The fact that the values for an enum are fields probably stems from the way they are actually stored in the .Net binary, as a set of static fields with a constant value. – Orvid King Nov 05 '12 at 13:32
  • How would you assign an enum value via codedom? As in Bugzilla = 1, Redmine = 2, etc.? – Corey Alix Aug 08 '18 at 18:53
  • Use InitExpression (e.g. f.InitExpression = new CodePrimitiveExpression(value)); – Corey Alix Aug 08 '18 at 18:57