2010-04-17 11 views
7

Quiero crear una enumeración usando CodeDom API. He buscado lo suficiente en internet y obtengo resultados que apenas sirven de nada.creando enumeración usando .NET CodeDom

Lo que quiero es generar

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

que utilizan CodeTypeDeclaration y establecer que es IsEnum propiedad como verdadera, crearon un nombre y establezca sus atributos.

Ahora el mayor problema es cómo poblar el cuerpo?

me trataron

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

Aunque el uso de esta solución que puedo generar los Descripción atributos, al final de la línea sería ; y no , miembros

Respuesta

11

Enum son campos, a fin de utilizar 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); 
} 

(En este código simplificado, la Descripción siempre será la misma que el nombre del miembro. En su código real, de c urso, estos pueden ser diferentes)

Un pequeño capricho usted puede notar es que CodeDom añade una coma después del último valor de enumeración:.

public enum BugTracker { 

    [Description("Bugzilla")] 
    Bugzilla, 

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

Esto es permitido por el lenguaje C#, precisamente para el apoyo escenarios de código generados como este, y compilará bien aunque parezca un poco extraño para el lector humano.

+0

Bien puesto - no es particularmente obvio que las enumeraciones son de hecho un tipo de CodeMemberField. ¡Información útil en otros contextos! –

+0

De acuerdo, muy bien puesto. El hecho de que los valores de una enumeración sean campos probablemente se debe a la forma en que están realmente almacenados en el binario .Net, como un conjunto de campos estáticos con un valor constante. –

Cuestiones relacionadas