我对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方法)。正如我们所见,Actions是子模板。但是如果我将断点插入到注释“BREAKPOINT HERE”的行中,我会在GenerationEnvironment对象中看到所有需要的代码。如果我引入单独的变量并返回尝试其值,问题仍然存在:值已设置,但没有任何内容呈现输出。
有什么想法吗? :)
答案 0 :(得分:1)
快速找到解决方案:)刚改变了这个:
<#+foreach (var action in PropertyActions)
action.TransformText();#>
到此:
<#+foreach (var action in PropertyActions)
#><#=action.TransformText()#>;#>