T4 参数指令
在 Visual Studio 文本模板中,parameter 指令声明模板代码中从自外部上下文传入的值初始化的属性。 如果编写调用文本转换的代码,则可以设置这些值。
使用参数指令
<#@ parameter type="Full.TypeName" name="ParameterName" #>
parameter 指令声明模板代码中从自外部上下文传入的值初始化的属性。 如果编写调用文本转换的代码,则可以设置这些值。 这些值既可以在 Session 字典中传递,也可以在 CallContext 中传递。
可以声明任何远程类型的参数。 也就是说,类型必须使用 SerializableAttribute 进行声明,或者必须从 MarshalByRefObject 派生。 这样可以将参数值传递到在其中处理模板的 AppDomain 中。
例如,可以使用以下内容编写文本模板:
<#@ template language="C#" #>
<#@ parameter type="System.Int32" name="TimesToRepeat" #>
<# for (int i = 0; i < TimesToRepeat; i++) { #>
Line <#= i #>
<# } #>
将参数值传递到模板
如果要编写诸如菜单命令或事件处理程序等的 Visual Studio 扩展,则可以使用文本模板化服务来处理模板:
// Get a service provider – how you do this depends on the context:
IServiceProvider serviceProvider = dte; // or dslDiagram.Store, for example
// Get the text template service:
ITextTemplating t4 = serviceProvider.GetService(typeof(STextTemplating)) as ITextTemplating;
ITextTemplatingSessionHost host = t4 as ITextTemplatingSessionHost;
// Create a Session in which to pass parameters:
host.Session = host.CreateSession();
// Add parameter values to the Session:
session["TimesToRepeat"] = 5;
// Process a text template:
string result = t4.ProcessTemplate("MyTemplateFile.t4",
System.IO.File.ReadAllText("MyTemplateFile.t4"));
在调用上下文中传递值
或者,您可以在 CallContext 中作为逻辑数据传递值。
以下示例使用这两种方法来传递值:
ITextTemplating t4 = this.Store.GetService(typeof(STextTemplating)) as ITextTemplating;
ITextTemplatingSessionHost host = t4 as ITextTemplatingSessionHost;
host.Session = host.CreateSession();
// Pass a value in Session:
host.Session["p1"] = 32;
// Pass another value in CallContext:
System.Runtime.Remoting.Messaging.CallContext.LogicalSetData("p2", "test");
// Process a small template inline:
string result = t4.ProcessTemplate("",
"<#@parameter type=\"System.Int32\" name=\"p1\"#>"
+ "<#@parameter type=\"System.String\" name=\"p2\"#>"
+ "Test <#=p1#> <#=p2#>");
// Result value is:
// Test 32 test
将值传递给运行时(预处理过的)文本模板
通常没有必要将 <#@parameter#> 指令与运行时(预处理过的)文本模板配合使用。 相反,可以为生成的代码(通过它可以传递参数值)定义其他构造函数或可设置属性。 有关更多信息,请参见使用 T4 文本模板的运行时文本生成。
然而,如果要在运行时模板中使用 <#@parameter>,则可以使用会话字典将值传递给该参数。 举例来说,假设您已经创建了作为预处理过的模板(名为 PreTextTemplate1)的文件。 可以使用以下代码在您的程序中调用该模板。
PreTextTemplate1 t = new PreTextTemplate1();
t.Session = new Microsoft.VisualStudio.TextTemplating.TextTemplatingSession();
t.Session["TimesToRepeat"] = 5;
// Add other parameter values to t.Session here.
t.Initialize(); // Must call this to transfer values.
string resultText = t.TransformText();
从 TextTemplate.exe 获得参数
重要
parameter 指令不检索在 TextTransform.exe 实用工具的 –a 参数中设置的值。若要获得这些值,请在 template 指令中设置 hostSpecific="true",并使用 this.Host.ResolveParameterValue("","","argName")。