T4子模板TransformText()不起作用

时间:2013-06-18 13:25:23

标签: c# visual-studio t4

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

有什么想法吗? :)

1 个答案:

答案 0 :(得分:1)

快速找到解决方案:)刚改变了这个:

<#+foreach (var action in PropertyActions)
            action.TransformText();#>

到此:

<#+foreach (var action in PropertyActions)
            #><#=action.TransformText()#>;#>