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