1

CMS から出力される XML スキーマから .NET 型を生成するコードをいくつか書きました。これは順調に進んでおり、期待どおりの結果が得られています。

ここで、生成された型のデフォルト (パラメーターなし) コンストラクターをカスタマイズしたいと考えています。次のようなコードがあります。

CodeNamespace codeNamespace = new CodeNamespace("MyNamespace");

// import type mappings from schema
// export type mappings into codeNamespace

CodeTypeDeclaration codeType = codeNamespace.Types.First();

この時点で、正常に変更できcodeTypeます。属性、プロパティなどの追加/削除。

ただし、のMembersプロパティを調べるとcodeType、既定のコンストラクターがまだ定義されていないことがわかります。もちろん追加できます。CSharpCodeProvider.GenerateCodeFromNamespaceしかし、( を使用して)コード文字列を書き出すと、別の既定のコンストラクターが出力に追加されます (この場合、スキーマから派生したフィールドにいくつかの既定値を設定するため)。

私がやろうとしているのは、基本的に、デフォルトのコンストラクター内のメソッドへの呼び出しを挿入することです (codeType上記のように正常に追加できるメソッド)。

(どのように) コード文字列を書き出すときに、既定のコンストラクター(Members以前はコレクションに存在しなかった)が挿入されるという事実に対処できますか?

4

1 に答える 1

1

うーん、ちょっとヤバい気がする…

デバッグ中に混乱しました-デフォルトのコンストラクターを定義codeTypeしていないを見て、デフォルトのコンストラクターを含む型で生成されたソースと比較してました。

次のようなコードを使用して、両方のケースを処理できました。

var ctor = codeType.Members
                   .Cast<CodeTypeMember>()
                   .SingleOrDefault(m => m.GetType() == typeof(CodeConstructor));
if (ctor == null)
{
    //codeType didn't define a default constructor, so create one
    ctor = new CodeConstructor() { Attributes = MemberAttributes.Public };
}
else
{
    //codeType did define a default constructor, remove it before modifying
    codeType.Members.Remove(ctor);
}

//make some modifications to ctor

//add ctor to the codeType
codeType.Members.Add(ctor);
于 2013-04-04T04:41:22.737 に答える