我正在尝试创建一个可以导入到文本模板中的库,以使我的模板更易于使用。我的库的主要参数是模板对象。虽然这不是最佳实践,但我还没有找到可行的解决方法。一旦我有了对库中模板对象的引用,我就会尝试将模板的输出保存到另一个位置。 这是库的代码。
namespace Templates
{
public class Helper
{
private readonly object _thisTemplate = null;
public Helper(object input) => _thisTemplate = input;
public void SaveToFile(string path)
{
var transformTextMethod = _thisTemplate.GetType().GetMethod("TransformText");
var content = transformTextMethod.Invoke(_thisTemplate, new object[] {}).ToString();
using (System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Create))
{
using (System.IO.StreamWriter sr = new System.IO.StreamWriter(fs))
{
sr.WriteLine(content);
sr.Flush();
}
}
}
}
}
这是我用来调用这个库的模板
<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ assembly name="$(ProjectDir)$(OutDir)$(TargetFileName)" #>
<#@ output extension="\" #>
<#
var helper = new Templates.Helper(this);
var outputFile = this.Host.TemplateFile.Replace(".tt",".txt");
#>
<#= DateTime.Now.ToString() #>
<# helper.SaveToFile(outputFile); #>
模板具有<#@ output extension="\" #>
,因此不会生成任何输出,而是尝试使用SaveToFile
方法保存它。当我尝试使用TextTemplatingFileGenerator运行它时,它使Visual Studio崩溃。为了获得更多信息,我尝试将其作为TextTemplatingFilePreProcessor运行,但这工作正常。
谁能告诉我我做错了什么?
我也接受了BurnsBA的建议,并调整了模板以与TextTransform.exe一起使用,但是这也崩溃了。
作为一种解决方法,我在解决方案目录的模板文件夹中有一个基本模板,并像这样在其中添加了该方法......
<#+
void SaveFile(string path)
{
var content = this.GenerationEnvironment.ToString();
using (System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Create))
{
using (System.IO.StreamWriter str = new System.IO.StreamWriter(fs))
{
str.WriteLine(content.Trim("nr".ToCharArray()));
str.Flush();
}
}
}
#>
。然后使用这样的包含指令在我的模板顶部引用这个基本模板......
<#@ include file="$(SolutionDir)TemplatesBaseTemplate.ttinclude" #>
如果有人有任何想法,我仍然想找到一种可行的方法来将此功能保存在类中?
你有一个无限循环...
在Helper.SaveToFile
内调用TransformText
会导致模板被评估,该模板调用Helper.SaveToFile
再次调用TransformText
等。
基类实现之所以有效,是因为您使用的是GenerationEnvironment
属性,该属性不会再次计算模板。