4

我想使用另一个 t4 模板来代替 this.WriteLine("Hello, World!"); 。那可能吗?

 <#@ template language="C#" hostspecific="True" debug="True" #>

<#@ output extension="txt" #>
<#@ include file="T4Toolbox.tt" #>

Sample Content

<#    for(int i=7;i<9;i++){

        SampleTemplate template = new SampleTemplate();
        template.Output.File = @"SubFolder\SampleOutput"+i+".txt";
        template.Output.Project = @"..\ClassLibrary2\ClassLibrary2.csproj";        
        template.Render();
    }
#>


<#+
    public class SampleTemplate : Template
    {
        public override string TransformText()
        {            
            this.WriteLine("Hello, World!");

            return this.GenerationEnvironment.ToString();
        }
    }
#>
4

1 回答 1

0

创建一个 T4 函数,将当前模板输出重定向到您指定的文件 - 将其保存为 SaveOutput.tt:

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ import namespace="System.IO" #>
<#

void SaveOutput(string outputFileName)
{
  string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
  string outputFilePath = Path.Combine(templateDirectory, outputFileName);
  File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString()); 
  this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
}

#>

在生成输出代码时,调用函数:

<#@ include file="SaveOutput.tt" #>
<#
    GenerateFile1();
    SaveOutput("File1.txt");  

    GenerateFile2();
    SaveOutput("File2.txt");
#>
<#
    void GenerateFile1()
    {
#>
This is file 1
<#
    }  

    void GenerateFile2()
    {
#>
This is file 2
<#+
    }
#>

注意:我从Oleg Sych的博客中获取了这段代码,因为他在他的博客上发布了一个现已失效的链接,其中显示了回答这个问题所需的步骤。由于 SO 不喜欢仅链接的答案,因此我重新发布了该博文中的相关代码。您可以在此处的回程机器上找到他的博文副本。唯一的区别是我在每个 T4 代码块开始后删除了“+”字符——它们似乎不是必需的。

于 2020-06-26T13:57:48.647 回答