我们的想法是在你的模板中使用函数PushIndent() 和PopIndent(),如下所示:
namespace <#= Namespace #>
{
public partial class <#= ClassName #>
{ <# PushIndent(" "); #>
<#@ include file="Snippet.txt" #>
<# PopIndent(); #>
}
}
除非这不起作用,因为生成的打印机代码使用函数Write() 来打印输出,但是,Write() 忽略缩进...
但是!您实际上可以控制您的模板最终调用什么函数实现来打印输出。当 T4 为您的代码生成打印机类时,它会自动创建一个基类,其中包含 Write()、WriteLine()、TransformText() 等函数。然后,生成的模板设置为从该类继承,将 TransformText() 覆盖为打印他们自己的文本。
这个想法是提供你自己的基类,它符合该基类的鸭接口,以使Write()使用缩进。 T4 允许您这样做!参见例如this blogpost for starters。
要使用缩进,请注意它们仅用于新行。然后,将Write() 更改为以下内容:
public void Write(string textToAppend)
{
GenerationEnvironment.Append(textToAppend.Replace("\r\n", "\r\n" + currentIndent));
}
并从模板中的基类继承(例如,基类的名称是CodePrinterBase):
<#@ template debug="false" hostspecific="true" language="C#" inherits="CodePrinterBase" #>
<#@ assembly name="App" #>
namespace <#= Namespace #>
{
public partial class <#= ClassName #>
{ <# PushIndent(" "); #>
<#@ include file="Snippet.txt" #>
<# PopIndent(); #>
}
}
结果:
namespace MyNamespace
{
public partial class MyClass
{
public void Function()
{
}
}
}
如果您还想删除 sn-p 之后的新行,请删除该 sn-p 中的尾随新行。
需要明确的是,PushIndent() 在括号之后,因为需要在代码运行之后插入新行。如果你把它放在括号下面并在它后面留下一个空行,如下所示,你会在输出中得到一个额外的空行:
{
<# PushIndent(" "); #>
<#@ include file="Snippet.txt" #>
跑步会给你带来:
namespace MyNamespace
{
public partial class MyClass
{
public void Function()
{
}
}
}
这对我来说完美无缺!