【T4实践-2】--创建设计时模板
使用设计时 T4 文本模板,您可以在 Visual Studio 项目中生成程序代码和其他文件。 通常,您编写一些模板,以便它们根据来自模型的数据来改变所生成的代码。 模型是包含有关应用程序要求的关键信息的文件或数据库。像一些常用的框架,基本都是根据数据库模型来生成代码框架的。
一、具体步骤
1、新建项目名为:T4Sample,添加新项,选择“文本模板”即可创建设计时模板
模板属性,请确认:
自定义工具 = |
TextTemplatingFileGenerator |
生成操作 = |
无 |
打开模板,默认只有两行语句
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>
2、修改模板,依然以HelloWorld为例
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Collections.Generic" #>
using System;
namespace Test
{
public class HelloWorld
{
public static void Main(string[] args)
{
<#
List<Person> people = GetPersonList();
foreach(Person p in people)
{
#>
Console.WriteLine("Hello {0},Welcome to T4 World!","<#= p.Name #>");
<#}
#>
}
}
}
<#+
//类
public class Person
{
///名称
public string Name{ get; set; }
public Person(string name)
{
this.Name = name;
}
}
//初始化众人
public List<Person> GetPersonList()
{
List<Person> people = new List<Person>();
Person p1 = new Person("Tom");
Person p2 = new Person("Jim");
Person p3 = new Person("Lucy");
people.Add(p1);
people.Add(p2);
people.Add(p3);
return people;
}
#>
3、生成代码,可通过以下方式
- 保存
- 编辑模板,然后将焦点更改到其他 Visual Studio 窗口
- 右击模板文件,选择“运行自定义工具”
- 在“解决方案资源管理器”工具栏中单击“转换所有模板”。 这将转换 Visual Studio 解决方案中的所有模板。
生成代码如下:
using System;
namespace Test
{
public class HelloWorld
{
public static void Main(string[] args)
{
Console.WriteLine("Hello {0},Welcome to T4 World!", "Tom");
Console.WriteLine("Hello {0},Welcome to T4 World!", "Jim");
Console.WriteLine("Hello {0},Welcome to T4 World!", "Lucy");
}
}
}
二、模板指令
首先了解最重要的指令块,在以后复杂的模板编写中,将会经常用到。
其实T4模板就是C#代码(当然还有VB)与文本的组合,一些逻辑代码就跟写C#代码一样。下一章将给出具体如何写T4模板。
C#代码与T4不同,就是引用、调试、输出等方面,而T4中最重要的指令Template ,就包含这些不同。
所以这里特别重点强调下指令Template,方便在以后复杂的T4模板编写中,能够得心应手。
使用 Template 指令
<#@ template [language="VB"] [hostspecific="true"] [debug="true"] [inherits="templateBaseClass"] [culture="code"]
[compilerOptions="options"] #>
template 指令有多个特性,通过这些特性可以指定转换的不同方面。 所有特性都是可选的。
1、compilerOptions 特性
示例:
compilerOptions="optimize+"
有效值:
任何有效的编译器选项。
在模板已经转换为 Visual C# 或 Visual Basic 并且生成的代码已编译时会应用这些选项。
2、culture 特性
示例:
culture="de-CH"
有效值:
"",不变的区域性,它是默认值。
表示为 xx-XX 形式字符串的区域性。 例如:en-US、ja-JP、de-CH、de-DE。
Culture 特性指定将表达式块转换为文本时要使用的区域性。
3、debug 特性
示例:
debug="true"
有效值:
true, false. 默认值为 false。
debug 特性指定是否启用调试。 如果是 true,则中间代码文件将包含使调试器能够识别模板中中断或异常发生位置的信息。 对于
设计时模板,中间代码文件将写入您的 %TEMP% 目录。
若要在模板执行的特定点启动调试器,请插入对 Launch 的调用。 若要在后续的点处中断执行,请插入对 Break 的调用。
<#@ template debug="true" language="C#" #>
<#@ output extension=".txt" #>
Output something.
<#
// Break here:
System.Diagnostics.Debugger.Launch();
#>
Output more.
<#
// Break here also:
System.Diagnostics.Debugger.Break();
#>
Output more.
4、hostspecific 特性
有效值:
true, false. 默认值为 false。
如果将此特性的值设置为 true,则会将名为 Host 的属性添加到由文本模板生成的类中。 该属性是对转换引擎的宿主的引用,并声
明为 Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost。 如果已经定义了自定义宿主,则可以将其转换为自
定义宿主类型。
因为此属性的类型取决于宿主的类型,所以仅当编写只适用于特定宿主的文本模板时才有用。
当 hostspecific 为 true,而且正在使用 Visual Studio 时,可以将 this.Host 强制转换为 IServiceProvider,以访问 Visual
Studio 功能。 还可以使用 Host.ResolvePath(filename) 来获得项目中文件的绝对路径。
5、language 特性
示例:
language="VB"
有效值:
C#(默认值)
VB
(值 VBv3.5 和 C#v3.5 在此版本中已过时,但是会解释为 VB 和 C#。)
language 特性指定要用于语句和表达式块中的源代码的语言(Visual Basic 或 Visual C#)。 从中生成输出的中间代码文件将使
用此语言。 此语言与您的模板生成的语言无关,它可以是任何类型的文本。
6、inherits 特性
可以指定模板的程序代码可以继承自另一个类,这个类也可以从文本模板生成。
三、后续
如果编写T4模板,如何更好更快的编写呢?下一章,将给出答案。