我不确定这会解决你的问题。我在 T4 方面没有太多经验。话虽如此,我正在使用它来构建项目中的许多文件,并且我没有遇到你遇到的问题。
在我的情况下,我有一堆单独的 .tt 文件,它们渲染项目中的单独文件。
我使用的方法如下:我有一个 SaveOutput 方法(我相信是从 stackoverflow 上借鉴来的):
void SaveOutput(string outputFileName)
{
if (!string.IsNullOrEmpty(outputFileName))
{
string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
string outputFilePath = Path.Combine(templateDirectory, outputFileName);
string output = this.GenerationEnvironment.ToString();
File.WriteAllText(outputFilePath, output);
}
this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
}
在我的主 .tt 文件中,我有 <#@ includes... #> 用于我的各个单独文件的各种 .tt 文件。例如:<#@ include file="DataObjectInterface.tt" #>。
<#+
public string GenerateInterfaceDataObject(sqlTable table)
{
string ifaceName = "I" + table.ObjectName;
if (table.GenerateInterfaceObjectAsBase)
{
ifaceName += "Base";
}
#>
using System;
namespace <#= InterfaceNamespace #>
{
public interface <#= ifaceName #>
{
<#+
foreach(sqlColumn col in table.Columns)
{
#>
<#= GetColumnCSharpDataType(col) #> <#= col.FieldName #> { get; }
<#+
}
#>
}
}
<#+
return RootPath + @"\AutoGenerated\" + ifaceName + ".cs";
}
#>
然后,在我的主 .tt 类中,我只需像这样调用:
string filePath = GenerateInterfaceDataObject(table);
SaveOutput(filePath);
不确定这种将模板分解的方法是否适合您的需求,但它适合我的需求,并且我还没有遇到任何问题。
我应该澄清一下,我的主要.tt文件实际上并不从自身生成任何内容。它本身不是一个模板。它只是加载每个模板并从其他模板生成文件。