2012-03-04 6 views

答えて

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()を呼び出して、あなたのストリームにStringWriterの内容を書き込み、StringWriterをクリアすることができます。しかし、あなたはまだWrite()のすべての過負荷に対処する必要があります。

+3

私はカスタムベースクラスから継承できることがわかりました。 <#@ template language = "C#" inherits = "TemplateBase"#> ここで書き込みメソッドなどを定義できます。 –

+0

あなたはそうです、それはそれほど「ハッキリ」ではないソリューションです。 – svick

関連する問題