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

时间:2012-03-04 13:55:41

标签: c# stream t4 stringbuilder

我喜欢使用预处理的T4模板生成大量文本。如果TransformText();那将是理想的;方法写入蒸汽而不是使用 System.Text.StringBuilder GenerationEnvironment; 在基类。

有人知道如何覆盖这种行为吗?

1 个答案:

答案 0 :(得分:2)

在生成的代码中似乎没有任何预期的扩展点可以允许您这样做。但是如果你看看生成的代码,它看起来像这样:

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()方法的代码可能更复杂,以反映生成的Write()所做的事情(主要与缩进生成的文本有关)。基类还包含Write()的其他重载,您可能也需要隐藏它们。

或者,如果您不想镜像生成的Write()中的代码,可以在base.Write()中调用Write(),写下StringWriter的内容到您的信息流,然后清除StringWriter。但是你仍然需要处理Write()的所有重载。