T4 テンプレートに関して非常に奇妙な状況があります。
テンプレートで生成されるエンティティを表す文字列のコレクションがあります。ここに私はそのようなコードを持っています:
<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".cs" #>
<#@ include file="EntityTemplate.tt" #>
<#
// kinda var Names = new List<string>();
foreach (name in Names)
{
EntityTemplate template = new EntityTemplate();
template.EntityClassName = name;
template.PropertyActions = new System.Collections.Generic.List<ConfigActionBase>
{
new DefaultAction,
new ValidateAction
};
ProcessContent(name + ".cs", template.TransformText());
}
#>
DefaultAction と ValidateAction は Microsoft.VisualStudio.TextTemplating.TextTransformation から継承され、次のように TransformText() メソッドをオーバーライドします。
<#+public class ValidateAction: Microsoft.VisualStudio.TextTemplating.TextTransformation
{
public override string TransformText()
{#>
public void Foo()
{ throw new NotImplementedException(); }
<#+return GenerationEnvironment.ToString(); // BREAKPOINT HERE
}
}#>
そして ProcessContent() メソッドは次のとおりです。
public void ProcessContent(string outputFileName, string content)
{
string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
string outputFilePath = Path.Combine(templateDirectory, outputFileName);
File.WriteAllText(outputFilePath, content);
}
そして、ここに私の EntityTemplate クラスがあります:
<#+
public class EntityTemplate : Microsoft.VisualStudio.TextTemplating.TextTransformation
{
public string EntityClassName { get; set; }
public System.Collections.Generic.List<Microsoft.VisualStudio.TextTemplating.TextTransformation> PropertyActions { get; set; }
public override string TransformText()
{#>
namespace MyGenerated
{
public class <#= EntityClassName #>
{
<#+foreach (var action in PropertyActions)
action.TransformText();#>
}
}
<#+return this.GenerationEnvironment.ToString();
}
}#>
したがって、問題は、私のテンプレートがクラス名と空の中括弧のみを生成し、アクションがコード (Foo メソッド) を生成しないことです。ご覧のとおり、アクションはサブテンプレートです。しかし、「BREAKPOINT HERE」とコメントされている行にブレークポイントを挿入すると、GenerationEnvironment オブジェクト内に必要なすべてのコードが表示されます。そして、別の変数を導入してその値を試してみると、問題はまだここにあります。値は設定されていますが、出力には何もレンダリングされません。
何か案は?:)