文本模板实用工具方法
在 Visual Studio 文本模板中写入代码时,这几种方法始终可用。 在 TextTransformation 中定义这些方法。
提示
还可以在常规(未预处理)文本模板中使用主机环境提供的其他方法和服务。 例如,可以解决文件路径、记录错误并获取 Visual Studio 和任意已加载包提供的服务。 有关详细信息,请参阅从文本模板访问 Visual Studio。
写入方法
可以使用 Write()
和 WriteLine()
方法在标准代码块内追加文本,而不是使用表达式代码块。 以下两个代码块功能一样。
包含表达式块的代码块
<#
int i = 10;
while (i-- > 0)
{ #>
<#= i #>
<# }
#>
使用 WriteLine() 的代码块
<#
int i = 10;
while (i-- > 0)
{
WriteLine((i.ToString()));
}
#>
你会发现使用其中一个这些实用工具方法(而不是长代码块中具有嵌套控件结构的表达式块)会很有帮助。
Write()
和 WriteLine()
方法具有两个加载,一个采用单个字符串参数,另一个采用组合格式字符串和要包含在字符串中的对象阵列(如 Console.WriteLine()
方法)。 WriteLine()
的以下两种用法功能一样:
<#
string msg = "Say: {0}, {1}, {2}";
string s1 = "hello";
string s2 = "goodbye";
string s3 = "farewell";
WriteLine(msg, s1, s2, s3);
WriteLine("Say: hello, goodbye, farewell");
#>
缩进方法
可以使用缩进方法设置文本模板的输出格式。 TextTransformation 类具有 CurrentIndent
字符串属性,可以显示文本模板中的当前缩进,还具有 indentLengths
字段,其中包含已添加的缩进列表。 可以使用 PushIndent()
方法添加缩进,使用 PopIndent()
方法减去缩进。 如果要删除所有缩进,请使用 ClearIndent()
方法。 以下代码块演示这些方法的用法:
<#
WriteLine(CurrentIndent + "Hello");
PushIndent(" ");
WriteLine(CurrentIndent + "Hello");
PushIndent(" ");
WriteLine(CurrentIndent + "Hello");
ClearIndent();
WriteLine(CurrentIndent + "Hello");
PushIndent(" ");
WriteLine(CurrentIndent + "Hello");
#>
此代码生成以下输出:
Hello
Hello
Hello
Hello
Hello
错误和警告方法
可以使用错误和警告实用工具方法将消息添加到 Visual Studio 错误列表中。 例如,以下代码将错误消息添加到错误列表。
<#
try
{
string str = null;
Write(str.Length.ToString());
}
catch (Exception e)
{
Error(e.Message);
}
#>
对主机和服务提供商的访问
属性 this.Host
可以提供对由正在执行模板的主机公开的属性的访问。 若要使用 this.Host
,必须在 <@template#>
指令中设置 hostspecific
属性:
<#@template ... hostspecific="true" #>
this.Host
的类型取决于正在其中执行模板的主机类型。 在 Visual Studio 中运行的模板中,可以将 this.Host
强制转换为 IServiceProvider
,以获取对服务(如 IDE)的访问。 例如:
EnvDTE.DTE dte = (EnvDTE.DTE) ((IServiceProvider) this.Host)
.GetService(typeof(EnvDTE.DTE));
使用一组不同的实用工具方法
作为文本生成过程的一部分,模板文件将转换为一个类,该类始终命名 GeneratedTextTransformation
并继承自 TextTransformation。 如果要改为使用一组不同的方法,则可以编写自己的类,并在模板指令中指定它。 类必须从 TextTransformation 继承。
<#@ template inherits="MyUtilityClass" #>
使用 assembly
指令引用可在其中找到已编译类的程序集。