11

を使用して列挙型を作成したい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プロパティをtrueに設定して使用し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);

このソリューションを使用すると、Description属性を生成できますが、行末はそうでは;ありません。,

4

1 に答える 1

19

列挙型メンバーはフィールドであるため、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#言語で許可されており、人間の読者には少し奇妙に見えても、正常にコンパイルされます。

于 2010-04-17T07:33:52.533 に答える