1

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

有任何想法吗?:)

4

1 回答 1

1

很快找到了解决方案:) 只是改变了这个:

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

对此:

<#+foreach (var action in PropertyActions)
            #><#=action.TransformText()#>;#>
于 2013-06-19T04:47:39.150 回答