T4模板

1. T4基本语法

T4语法主要包括三类:1指令 2文本块 3指令块

1.1. 指令

1
2
3
<# 标准控制块 #> 可以包含语句
<#= 表达式控制块 #> 可以包含表达式
<#+ 类特征控制块 #> 可以包含方法、属性和字段,就像一个类的内部

指令主要包括template, output, assembly, import, include等类型
在这里是指令T4语法以<#开头结尾

1
<#@ 指令 属性=“值”#>

1.1.1. 模板指令

1
<#@ template debug="false" hostspecific="false" language="C#" #>
  • language: 输出语言.
  • debug: 是否启用调试.
  • hostspecific:有效值true、false,默认为false。如果将此特性的值设置为 true,则会将名为 Host 的属性添加到由文本模板生成的类中。 该属性是对转换引擎的宿主的引用,并声明为Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost。
  • inheirits:可以指定模板的程序代码可以继承自另一个类

1.2. 输出指令

1
<#@ output extension=".cs" #>

生成文件的后缀名.

1.3. 程序集指令

1
<#@ assembly name='System' #>

告诉T4引擎编译运行时引用System程序集.

  • $(SolutionDir):当前项目所在解决方案目录
  • $(ProjectDir):当前项目所在目录
  • $(TargetPath):当前项目编译输出文件绝对路径
  • $(TargetDir):当前项目编译输出目录,即web项目的Bin目录,控制台、类库项目bin目录下的debug或release目录(取决于当前的编译模式)

举个例子:比如我们在D盘根目录建立了一个控制台项目MyTest,解决方案目录为D:\Feng,项目目录为

1
2
3
4
5
D:\Feng\MyTest,那么此时在Debug编译模式下
$(SolutionDir)的值为D:\Feng
$(ProjectDir)的值为D:\Feng\MyTest
$(TargetPath)值为D:\Feng\MyTest\bin\Debug\MyTest.exe
$(TargetDir)值为D:\Feng\MyTest\bin\Debug\

1.3.1. 导入指令

1
<#@ import namespace="System.Data" #>

告诉T4引擎编译运行时引用某个名称空间。在 Visual Studio T4 文本模板的代码块中,import 指令允许您在不提供完全限定名称的情况下引用另一个命名空间中的元素。 它等效于 C# 中的 using 或 Visual Basic 中的 imports。默认已经导入了System命名空间的引用。

1.3.2. 包含指令

1
<#@ include file="Base.ttinclude"#>

运行时引用某个文件,类似于JS的引用。

包含指令可以提高代码复用率,比如我们可以将一些常用的程序集、命名空间引用放到一个文件里,使用时仅需要引用下即可,省去了每次都要重新引用一遍的烦恼,如我们建立Reference.ttinclude文件,里面包含了我们平时常用的程序集引用。

1
2
3
4
5
6
7
8
9
10
11
<#@ assembly name="System.Core.dll" #>
<#@ assembly name="System.Data.dll" #>
<#@ assembly name="System.Data.DataSetExtensions.dll" #>
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>

使用时只需要使用包含指令引用下即可

1
<#@ include file="$(ProjectDir)Reference.ttinclude"  #>

1.3.3. 参数指令

1
<#@ parameter type="string" name="ParameterName" #>

顾名思义就是定义一个参数在其他的地方使用。

1.4. 文本块

文本块直接向输出文件插入文本。

1.5. 指令块

主要用于控制文本的输出。在控制块中可以写任意的C#代码