2010-04-17 3 views
7

Je souhaite créer une énumération à l'aide de CodeDom API. J'ai assez cherché sur Internet et j'ai des résultats qui ne sont guère utiles.Création d'une énumération à l'aide du CodeDom de .NET

Ce que je veux générer est

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

J'utilisé CodeTypeDeclaration et placèrent est IsEnum propriété comme vrai, a créé un nom, et définissez ses attributs.

Maintenant, le plus gros problème est de savoir comment peupler le corps?

J'ai essayé

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

Bien que l'utilisation de cette solution que je peux générer les attributs de description, la fin de la ligne serait ; et non ,

Répondre

11

membres Enum sont des champs, utilisez donc 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); 
} 

(Dans ce code simplifié, la description sera toujours la même que le nom du membre. Ourse, ceux-ci peuvent être différentes)

Un peu bizarrerie vous remarquerez peut-être que CodeDom ajoute une virgule après la dernière valeur ENUM.

public enum BugTracker { 

    [Description("Bugzilla")] 
    Bugzilla, 

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

Ceci est permis par le langage C#, précisément afin de soutenir Scénarios de code généré comme celui-ci, et compilera bien même si elle semble un peu étrange pour le lecteur humain.

+0

Bien placé - il n'est pas particulièrement évident que les enums sont en fait un type de CodeMemberField. Informations utiles dans d'autres contextes! –

+0

D'accord, très joliment mis. Le fait que les valeurs d'une énumération soient des champs provient probablement de la façon dont elles sont réellement stockées dans le binaire .Net, sous la forme d'un ensemble de champs statiques avec une valeur constante. –

Questions connexes