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