我喜欢使用经过预处理的 T4 模板生成大量文本。这将是理想的,如果 TransformText();方法写入 Steam 而不是使用 System.Text.StringBuilder 生成环境; 在基类中。
有人知道如何覆盖这种行为吗?
最佳答案
生成的代码中似乎没有任何允许您这样做的预期扩展点。但是如果您查看生成的代码,它看起来像这样:
public partial class PreTextTemplate : PreTextTemplateBase
{
public virtual string TransformText()
{
this.Write("some text");
return this.GenerationEnvironment.ToString();
}
}
public class PreTextTemplateBase
{
protected StringBuilder GenerationEnvironment { get { … } set { … } }
public void Write(string textToAppend)
{
// code to write to GenerationEnvironment
}
}
很明显,对this.Write()
的调用旨在从基类调用Write()
方法。但它不必调用该方法,您可以将其隐藏在类的非生成部分:
public partial class PreTextTemplate
{
private readonly StreamWriter m_streamWriter;
public PreTextTemplate(StreamWriter streamWriter)
{
m_streamWriter = streamWriter;
}
public new void Write(string text)
{
m_streamWriter.Write(text);
}
}
如果这样做,对 TransformText()
的调用实际上将写入 StreamWriter
,这正是您想要的。
实际上,Write()
方法的代码可能更复杂,以反射(reflect)生成的 Write()
所做的事情(主要与缩进生成的文本有关).基类还包含 Write()
的其他重载,您可能也需要隐藏这些重载。
或者,如果您不想在生成的 Write()
中镜像代码,您可以在 Write 中调用
,将base.Write()
()StringWriter
的内容写入你的流,然后清空StringWriter
。但是您仍然需要处理 Write()
的所有重载。
关于c# - 我如何在 t4 预处理模板中使用流而不是 stringbuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9555444/