C# 将T4生成的代码写入单独的输出文件

C# 将T4生成的代码写入单独的输出文件,c#,.net,templates,transformation,t4,C#,.net,Templates,Transformation,T4,我正在创建一个.tt文件,将文本转换为模型类,以便练习 生成了一个包含所有模型的.cs文件,但我希望每个模型都保存在不同文件夹中自己的.cs文件中 实现这一目标的最佳方法是什么 下面是一个简单的示例,说明如何从单个T4模板输出多个文件 使用SaveOutput-方法将输出文件(Content1.txt,Content2.txt..)创建到与.tt文件相同的文件夹中,使用saveoutputOSubfolder将输出文件转到单独的文件夹中(1\Content1.txt,2\Content2.txt

我正在创建一个
.tt
文件,将文本转换为模型类,以便练习

生成了一个包含所有
模型的
.cs
文件,但我希望每个
模型都保存在不同文件夹中自己的
.cs
文件中


实现这一目标的最佳方法是什么

下面是一个简单的示例,说明如何从单个T4模板输出多个文件

使用
SaveOutput
-方法将输出文件(Content1.txt,Content2.txt..)创建到与.tt文件相同的文件夹中,使用
saveoutputOSubfolder
将输出文件转到单独的文件夹中(1\Content1.txt,2\Content2.txt..)


文件内容

我不知道你所说的
松散
是什么意思?单独的文件,而不是打包在一个文件中谢谢!我通过使用StringBuilder和StreamWriter写入特定路径来修复它。我也会试试你的解决方案!使用
this.GenerationEnvironment.Remove(0,this.GenerationEnvironment.Length)
而不是仅使用
this.GenerationEnvironment.Clear()
?否则,这段代码就太棒了,我们对它进行了一些小的调整(例如,让它输出UTF-8),谢谢@很高兴听到我的片段有帮助。不幸的是,我不记得没有使用.Clear()的任何特定原因。我做了快速测试,它似乎在我的机器上工作。如果在您的机器上使用.Clear(),我可以修改我的答案,因为.Clear()更优雅。@RistoM非常感谢您,它大大简化了我们的T4转换,因为我们能够抛弃TemplateFileManager(T4.Helper)这使我们能够自动使用TextTransform.exe,而不依赖Visual Studio。@aolszowka我编辑了答案,感谢您的贡献!
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".txt" #>
<#
for (Int32 i = 0; i < 10; ++i) {
#>
File Content <#= i #>
<#

  SaveOutput("Content" + i.ToString() + ".txt");
  //Uncomment following to write to separate folder 1,2,3
  //SaveOutputToSubFolder(i.ToString(),"Content" + i.ToString() + ".txt");
}
#>
<#+
private void SaveOutput(string outputFileName) {
  string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
  string outputFilePath = Path.Combine(templateDirectory, outputFileName);
  File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString()); 
  this.GenerationEnvironment.Clear();
}
private void SaveOutputToSubFolder(string folderName, string outputFileName) {
  string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
  string newDirectoryName = Path.Combine(templateDirectory,folderName);
  if(!Directory.Exists(newDirectoryName))
    Directory.CreateDirectory(newDirectoryName);
  string outputFilePath = Path.Combine(newDirectoryName, outputFileName);
  File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString()); 
  this.GenerationEnvironment.Clear();
}
#>