簡體   English   中英

如何在t4預處理模板中使用流而不是stringbuilder

[英]how can i use streams instead of stringbuilder in t4 preprocessed template

我喜歡使用預處理的T4模板生成大量文本。 如果TransformText();那將是理想的; 方法寫入steam而不是使用System.Text.StringBuilder GenerationEnvironment; 在基類中。

有人知道如何覆蓋這種行為嗎?

在生成的代碼中似乎沒有任何預期的擴展點可以允許您這樣做。 但是如果你看一下生成的代碼,它看起來像這樣:

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()所有重載。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM