
14.4 T4指令
T4模板可以使用指令与其执行环境交流。每个指令都需要单独占一行,并用<#@和#>标记表示。本节讨论5个标准指令。
14.4.1 template指令
template指令控制着模板本身的许多不同选项。它包含如下特性。
●language:定义模板中Expression块、Statement块和Class Feature块使用的.NET语言。有效值是C#和VB。
●inherits:给生成的类确定用于生成输出文件的基类。它可以重写,以在模板文件中提供其他的功能。任何新基类都必须派生于Microsoft.VisualStudio.TextTemplating.TextTransformation,这是该特性的默认值。
如果希望继承另一个基类,就需要使用assembly指令(参见本章后面的14.4.3节),使该基类可用于T4模板。
●culture:为模板选择本地区域性。其值应使用标准表示法xx-XX (en-US、ja-JP等)来表示。默认值是空字符串,指定Invariant Culture。
●debug:打开Debug模式。这会把包含生成器类的代码文件转储在系统的临时文件夹中。该特性可以设置为true或false,默认为false。
●hostspecific:指定模板文件设计为在特定的主机上工作。如果该特性设置为true,就在该模板中显示Host属性。在Visual Studio 2015中运行时,这个特性的类型是Microsoft.VisualStudio. TextTemplating.VSHost.TextTemplatingService。它默认为false。这超出了本书的范围,但可以为T4编写自己的主机程序,再使用它执行模板文件。
14.4.2 output指令
output指令用于控制模板生成的文件。它包含两个特性。
●extension:该扩展名添加到生成器名上,以创建输出文件的名称。这个特性的内容基本上替代模板文件名中的.tt。该特性默认为.cs,但可以包含底层文件系统允许的任意序列字符串。
●encoding:控制生成文件的编码。这可以是System.Text.Encoding.GetEncodings()返回的任意编码结果,即UTF-8、ASCII和Unicode。默认值是Default,它会使编码等于运行模板的系统的当前ANSI代码页。
14.4.3 assembly指令
assembly指令用于给模板文件中的代码提供其他程序集中定义的类和类型的访问权限。它类似于给正常的.NET项目添加一个引用。它有一个name特性,该特性应该包含如下项之一。
●程序集的文件名:程序集从T4模板所在的目录中加载。
●程序集的绝对路径:程序集从所提供的确切路径中加载。
●程序集的相对路径:程序集从T4模板所在目录的相对位置上加载。
●程序集的强名:程序集从Global Assembly Cache(CAG)中加载。
14.4.4 import指令
import指令用于访问一些项,而不必指定它们完整的用名称空间限定的类型名。它的工作方式类似于VB中的Import语句或C#中的using语句。它有一个特性namespace。System名称空间默认已导入。下例显示了一个带import指令和不带import指令的小型Statement块。
C#
<# var myList = new System.Collections.Generic.List<string>(); var myDictionary = new System.Collections.Generic.Dictionary<string, System.Collections.Generic.List <string>>(); #>
VB
<# Dim myList As New System.Collections.Generic.List(Of String) Dim myDictionary As New System.Collections.Generic.Dictionary(Of System.String, System.Collections.Generic.List(Of String)) #>
C#
<#@ import namespace="System.Collections.Generic" #> <# var myList = new List<string>(); var myDictionary = new Dictionary<string, List<string>>(); #>
VB
<#@ import namespace="System.Collections.Generic" #> <# Dim myList As New List(Of String) Dim myDictionary As New Dictionary(Of String, List(Of String)) #>
带有import指令和assembly指令的代码可以在T4模板运行时执行,但不会包含在最终的输出文件中。如果希望在生成的输出文件中访问其他名称空间中的资源,就必须手动在生成的文件中包含using语句或Import语句,并像往常那样给项目添加引用。
14.4.5 include指令
include指令允许把另一个文件的内容直接复制到模板文件中。它有一个file特性,该特性值应是要包含的文件的相对或绝对路径。如果另一个文件包含T4指令或块,则它们也会执行。下面的例子把BSD License插入生成文件顶部的注释中。
' Copyright (c) <#=DateTime.Now.Year#>, <#=CopyrightHolder#> ' All rights reserved. ' Redistribution and use in source and binary forms, with or without ...
C#
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".generated.cs" #> <# var CopyrightHolder = "AdventureWorks Inc."; #> /* <#@ include file="License.txt" #> */ namespace AdventureWorks { // ... }
VB
<#@ template debug="false" hostspecific="false" language="VB" #> <#@ output extension=".vb" #> <# Dim CopyrightHolder = "AdventureWorks Inc." #> <#@ include file="License.txt" #> Namespace AdventureWorks ' ... End Namespace