전처리 된 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