создание перечисления с помощью CodeDom.NET

Я хочу создать использование Перечисления 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 свойство как верное, создало имя и установило, это - Атрибуты.

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

Я попробовал

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

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

10
задан Manish Sinha 17 April 2010 в 07:10
поделиться

1 ответ

Члены перечисления являются полями, поэтому используйте 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 # именно для поддержки сценариев сгенерированного кода, таких как это, и будет хорошо компилироваться, даже если это покажется немного странным читателю.

15
ответ дан 3 December 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: