c# - 我如何在 t4 预处理模板中使用流而不是 stringbuilder

标签 c# stream t4 stringbuilder

我喜欢使用经过预处理的 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/

相关文章:

c# - 刷新通知区域中的图标 (Windows CE)

c# - 使用或不使用 new 在 C# 中创建对象

C#:如何测试基本线程 worker 类

html - 通过 html5 使用 mp3 播放 icecast

c# - 在 C# T4 模板中通过 DTE 访问项目

T4 模板在新的 VS2017 csproj 项目中不生成输出

c# - 通过属性以外的方式将模型和订阅 key 传递给 LuisDialog

c++ - 帮助改进这个INI解析代码

javascript - 使用流异步读取文件时如何同步处理每一行/缓冲区

asp.net-mvc - 内置的MVC脚手架T4模板在哪里?