создание перечисления с использованием .NET CodeDom - PullRequest
10 голосов
/ 17 апреля 2010

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

Я хочу сгенерировать

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

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

Я пытался

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

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

1 Ответ

15 голосов
/ 17 апреля 2010

Члены Enum являются полями, поэтому используйте 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);
}

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

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

public enum BugTracker {

    [Description("Bugzilla")]
    Bugzilla,

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

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

...