2010-04-17 12 views
7

Ich möchte eine Enumeration mit CodeDom API erstellen. Ich habe im Internet genug gesucht und Ergebnisse erzielt, die kaum nützlich sind.erstellen Enumeration mit .NET CodeDom

Was ich erzeugen will, ist

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

I CodeTypeDeclaration verwendet und stellen Sie es IsEnum Eigenschaft als wahr, einen Namen erstellt, und legen Sie es Attribute ist.

Jetzt ist das größte Problem, wie man den Körper bevölkert?

Ich versuchte

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

Obwohl der Verwendung dieser Lösung habe ich die Beschreibung Attribute erzeugen kann, wäre das Ende der Linie ; sein und nicht ,

Antwort

11

Enum-Mitglieder sind Felder, so verwenden 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 diesem vereinfachten Code wird die Beschreibung immer mit dem Namen des Mitglieds übereinstimmen. In Ihrem echten Code von c ourse, diese können unterschiedlich sein)

Eine kleine Marotte Sie feststellen kann, ist, dass CodeDom ein Komma nach dem letzten Enum-Wert hinzufügt.

public enum BugTracker { 

    [Description("Bugzilla")] 
    Bugzilla, 

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

Dies wird durch die Sprache C# erlaubt ist, genau um Unterstützung generated-code Szenarien wie diese, und wird gut kompilieren, auch wenn es für den menschlichen Leser ein bisschen seltsam aussieht.

+0

Schön gesagt - es ist nicht besonders offensichtlich, dass enums tatsächlich eine Art von CodeMemberField sind. Nützliche Informationen in anderen Zusammenhängen! –

+0

Einverstanden, sehr schön hin. Die Tatsache, dass die Werte für eine Enumeration Felder sind, rührt wahrscheinlich davon her, wie sie tatsächlich in der .Net-Binärdatei gespeichert sind, als eine Menge von statischen Feldern mit einem konstanten Wert. –

Verwandte Themen