2010-04-17 3 views
7

Я хочу создать перечисление, используя CodeDom API. Я обыскал достаточно в Интернете, и я получаю результаты, которые вряд ли будут полезны.создание перечисления с использованием .NET CodeDom

То, что я хочу, чтобы произвести это

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 как истинное, созданное имя, и установить его атрибуты.

Теперь самая большая проблема заключается в том, как заполнить тело?

Я попытался

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

Хотя с помощью этого решения я могу генерировать Описание атрибутов, конец строки будет ; и не , членов

ответ

11

перечислений являются полями, так что используйте 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); 
} 

(В этом упрощенном коде описание всегда будет таким же, как имя участника. В вашем реальном коде c Медведица, они могут быть разными)

Немного причуды вы можете заметить, что CodeDom добавляет запятую после значения последних перечислений:.

public enum BugTracker { 

    [Description("Bugzilla")] 
    Bugzilla, 

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

Это разрешенный C# языком, именно для того, чтобы поддержка сценарии с генерируемым кодом, подобные этому, и будут компилироваться отлично, даже если это выглядит немного странным для читателя.

+0

Красиво поставлено - не особо очевидно, что перечисления на самом деле являются типами CodeMemberField. Полезная информация в других контекстах! –

+0

Согласен, очень красиво положить. Тот факт, что значения для перечисления являются полями, вероятно, связан с тем, как они фактически хранятся в двоичном формате .Net, как набор статических полей с постоянным значением. –

Смежные вопросы