前処理済みのT4テンプレートを使用して膨大な量のテキストを生成したい。これは、TransformText();メソッドは、代わりに蒸気に書き込みます。 System.Text.StringBuilder GenerationEnvironment;基本クラスの t4の前処理済みテンプレートでstringbuilderの代わりにストリームを使用する方法
誰もこの動作を無効にする方法を知っていますか?
前処理済みのT4テンプレートを使用して膨大な量のテキストを生成したい。これは、TransformText();メソッドは、代わりに蒸気に書き込みます。 System.Text.StringBuilder GenerationEnvironment;基本クラスの t4の前処理済みテンプレートで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()
メソッドのコードは、生成された内容(大部分は生成されたテキストをインデントすることに関連しています)を反映するために、さらに複雑になる可能性があります。また、基底クラスにはWrite()
という他のオーバーロードも含まれていますが、これも非表示にする必要があります。あなたが生成さWrite()
のコードを反映したくない場合は
あるいは、あなたは、あなたのWrite()
でbase.Write()
を呼び出して、あなたのストリームにStringWriter
の内容を書き込み、StringWriter
をクリアすることができます。しかし、あなたはまだWrite()
のすべての過負荷に対処する必要があります。
私はカスタムベースクラスから継承できることがわかりました。 <#@ template language = "C#" inherits = "TemplateBase"#> ここで書き込みメソッドなどを定義できます。 –
あなたはそうです、それはそれほど「ハッキリ」ではないソリューションです。 – svick