これは非常に奇妙な要件であると確信していますが、ここに行きます。
クラス ライブラリにコンパイルする C# クラスによって表される顧客構成コードがいくつかあります。これらの構成クラスを作成することは、現在、開発者以外の誰かに割り当てたい猿の仕事です。そのため、ビジネス アナリストが関連するオプションを選択してフォームに入力することにより、有効な C# クラスを生成するために使用できる "Configurator" Web サイトを構築しています。
MVC Web サイトのテンプレートから C# クラスを生成する最良の方法は何ですか? ここでは、実行時にクラスを動的に生成して実行することについて話しているわけではないことに注意してください。基本的には、まったく別のプロジェクトに含まれる C# コードをたまたま含むテキスト ファイルを生成しています。
これは、適切にグーグルするのが非常に難しいトピックであることが証明されています! 今まで出てきた選択肢…
- トークン化されたテキスト ファイルを使用し、String.Format を使用して値を置き換えるだけです。
- どういうわけかRazorをテンプレートエンジンとして使用します(ただし、方法がわからず、生成しているhtmlではありません)
- どういうわけかT4テンプレートを使用します(少なくともC#の生成に使用されていることは知っていますが、実行時に実行する方法はわかりません)
これにどのようにアプローチするのが最善かについてのアイデアはありますか?
リクエストに応じて、出力クラス/ファイルの例を次に示します。ここの値は、顧客固有のラベル、検証などで基本クラスに設定された値をオーバーライドします。これが、顧客向けに製品をカスタマイズする方法です。
public class AreaRiskTemplate: AreaRiskTemplateBase
{
public override string EntityName { get { return "risk"; } }
public override string EntityNamePlural { get { return "risks"; } }
public override string EntityNameArticle { get { return "a"; } }
public override string CGovItemRefPrefix { get { return "R"; } }
public override void SetFieldDefinitions()
{
FieldDefinitions.Level1.IsImplemented = true;
FieldDefinitions.Level1.Label = "Category";
FieldDefinitions.Level1.IsVisibleInGrid = true;
FieldDefinitions.Level2.IsImplemented = true;
FieldDefinitions.Level2.Label = "Team";
FieldDefinitions.Level2.IsVisibleInGrid = true;
FieldDefinitions.Description.IsImplemented = true;
FieldDefinitions.Description.Label = "Description";
FieldDefinitions.Description.IsVisibleInGrid = true;
}
public override ModelStateDictionary Validate()
{
var msd = new ModelStateDictionary();
// add template-specific validation here
msd.Merge(base.Validate());
return msd;
}
public override List<string> Level1Options
{
get
{
return new List<string>
{
"Organisational",
"Financial",
"Operational",
"External",
"IT"
};
}
}
}
更新: 現在、 http://msdn.microsoft.com/en-us/library/ee844259 (v=vs.100) .aspx で T4 テンプレートを調査しています (以下のコメントに感謝します)。有望に見えます。