我对 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 对象中看到所有需要的代码。如果我引入单独的变量并返回尝试它的值,问题仍然存在:设置了值,但没有呈现任何输出。
有任何想法吗?:)