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")
。