[英]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.