原文地址:http://www.cnblogs.com/heyuquan/archive/2012/07/26/2609412.html=============C#.Net 篇目录==============
示例代码:示例代码_for_真真理解T4_parameter指令.zip
本人最近在学习 T4 模板相关的知识,一些知料中文版的难找,所以翻翻老外的文章先译出来分享给大家。这里有篇入门文章 《你必须懂的T4模板:浅入深出》
Visual Studio 2010 引入了一个新的 T4 指令:参数指令。这个参数提供一种在文本模板中定义输入参数的标准方式。
<#@ parameter name="…" type="…" #>
name 为参数指定名称,参数名称必须是 C# 或 VB 有效标示符。
type 为参数指定类型,参数类型必须包含完整的命名空间,eg:System.String 。也可以使用自定义类型,自定义类型的程序集必须使用 <#@ assembly #> 指令引入。
补充:CallContext 和LogicalCallContext
因为本文讲到远程调用的相关应用,译者了解不多,所以在此补充这两个概念。
1. CallContext 是类似于方法调用的线程本地存储的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽。数据槽不在其他逻辑线程上的调用上下文之间共享。
CallContext API如下图(注意:没有提供构造函数):
也就是说,如果想让CallContext的数据被自动传递到当目标线程,只能将其作为LogicalCallContext。我们有两种方法将相应的数据存储为LogicalCallContext:
1. 调用CallContext的静态方法LogicalSetData 。
欲知更多,请参考:如何实现对上下文(Context)数据的统一管理
在模板转换期间,参数可做为只读的强类型属性在代码中使用(只生成属性的 get 访问器)。
<#@Parameter Name="MyParameter" Type="System.String"#>
Parameter in statement block: <# Write(MyParameter == null ? "null" : MyParameter); #>
Parameter in statement block: null
<#@template debug="false" hostspecific="True" language="C#"#>
<#@import namespace="System.IO"#>
<#@import namespace="System.Runtime.Remoting.Messaging"#>
<#@import namespace="Microsoft.VisualStudio.TextTemplating"#>
string templateFile = this.Host.ResolvePath("MyTemplate.tt");
string templateContent = File.ReadAllText(templateFile);
CallContext.LogicalSetData("MyParameter", "CallContextVall");
= engin.ProcessTemplate(templateContent, this.Host);
CallContext.FreeNamedDataSlot("MyParameter");
Parameter in statement block: CallContextVall
<#@template debug="false" hostspecific="True" language="C#"#>
<#@Import Namespace="System.IO"#>
<#@Import Namespace="Microsoft.VisualStudio.TextTemplating"#>
string templateFile = this.Host.ResolvePath("MyTemplate.tt");
string templateContent = File.ReadAllText(templateFile);
TextTemplatingSession session = newTextTemplatingSession();
session["MyParameter"] = "SessionValue";
var sessionHost = (ITextTemplatingSessionHost)this.Host;
sessionHost.Session = session;
string generatedContent = engine.ProcessTemplate(templateContent, this.Host);
Parameter in statement block: SessionValue
T4 引擎为模板为每个参数指令生成一个私有的、只读的属性。自动生成的转换类类似如下代码:
public partial class MyTemplate : TextTransformation
private string _MyParameterField;
get { return this._MyParameterField; } // 只读,私有属性
public override string TransformText()
this.GenerationEnvironment = null;
this.Write("\r\nParameter in statement block: ");
Write(MyParameter == null ? "null" : MyParameter);
return this.GenerationEnvironment.ToString();
注意 MyParameter 属性是私有字段,这个字段被生成类中重写的 Initialize() 方法进行初始化,Initialize() 方法在 Transform() 方法之前被执行。
正如您所看到的该模板将首先尝试从 Session 字典中检索的参数值,如果Session无此键则会尝试 CallContext 。
原文链接:http://www.olegsych.com/2010/05/t4-parameter-directive/