额,T4好陌生的名字,和NuGet一样很悲催,不为世人所熟知,却又在背后默默无闻的奉献着,直到现在我们项目组的人除了我之外,其它人还是对其豪无兴趣,基本上是连看一眼都懒得看,可怜的娃啊。。。 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。现在的VS中只要与代码生成相关的场景基本上都能找T4的身影,比如MVC的视图模板,Entity Framwork的DataContext模板等等。 在学习枯燥的概念前我们先来看一下用T4模版快速生成POCO实体类的示例 修改TextTemplate1.tt文件内容如下 <#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".cs" #> using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class User { /// <summary> /// 用户ID /// </summary> public int UserID { get; set; } /// <summary> /// 用户名 /// </summary> public string UserName { get; set; } /// <summary> /// 密码 /// </summary> public string Password { get; set; } /// <summary> /// Email /// </summary> public string Email { get; set; } /// <summary> /// 手机号 /// </summary> public string Mobile { get; set; } } } 点击Ctrl+S然后可以看到自动生成了一个TextTemplate1.cs文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { public class User { /// <summary> /// 用户ID /// </summary> public int UserID { get; set; } /// <summary> /// 用户名 /// </summary> public string UserName { get; set; } /// <summary> /// 密码 /// </summary> public string Password { get; set; } /// <summary> /// Email /// </summary> public string Email { get; set; } /// <summary> /// 手机号 /// </summary> public string Mobile { get; set; } } } 是不是很神奇,T4模版引擎会根据你在模版里定义的内容自动生成相应的文件,当然本示例过于简单,完全不能展现T4的强大,当你若真正了解T4后,会发现神马代码生成器全都是浮云,T4才是王道,利用T4你完全可以轻松生成属于自己风格的任何类型代码,在下篇文章会有实例展示如何通过T4连接数据库自动生成POCO类,基本上这个才是我们用T4的最大意图,呵呵,在这之前还是老老实实看看枯燥乏味的T4基础知识吧。 T4 文本模板有两种类型:设计时 T4 文本模板和运行时 T4 文本模板(“预处理过的”模板)
可在应用程序中执行运行时 T4 文本模板(“预处理过的”模板)以便生成文本字符串(通常作为其输出的一部分)。 若要创建运行时模板,请向您的项目中添加“已预处理的文本模板”文件。 另外,您还可以添加纯文本文件并将其“自定义工具”属性设置为“TextTemplatingFilePreprocessor”。 有关更多信息,请参见使用预处理 T4 文本模板生成运行时文本。 有关模板语法的更多信息,请参见编写 T4 文本模板。
在 Visual Studio 中执行设计时 T4 文本模板,以便定义应用程序的部分源代码和其他资源。 通常,您可以使用读取单个输入文件或数据库中的数据的多个模板,并生成一些 .cs、.vb 或其他源文件。 每个模板都生成一个文件。 在 Visual Studio 或 MSBuild 内执行它们。 若要创建设计时模板,请向您的项目中添加“文本模板”文件。 另外,您还可以添加纯文本文件并将其“自定义工具”属性设置为“TextTemplatingFileGenerator”。 有关更多信息,请参见使用 T4 文本模板生成设计时代码。 有关模板语法的更多信息,请参见编写 T4 文本模板。 文本模板由以下部件组成:T4 文本模板指令
$(SolutionDir):当前项目所在解决方案目录 $(ProjectDir):当前项目所在目录 $(TargetPath):当前项目编译输出文件绝对路径 $(TargetDir):当前项目编译输出目录,即web项目的Bin目录,控制台、类库项目bin目录下的debug或release目录(取决于当前的编译模式) 举个例子:比如我们在D盘根目录建立了一个控制台项目TestConsole,解决方案目录为D:\LzrabbitRabbit,项目目录为
文本块文本块直接向输出文件插入文本。 文本块没有特殊格式。 例如,下面的文本模板将生成一个包含单词“Hello World!”的文本文件: <#@ output extension=".txt" #> Hello World! 控制块控制块是用于转换模板的程序代码节。 默认语言是 C#,但若要使用 Visual Basic,可以在文件开头编写以下指令: <#@ template language="VB" #> 用于编写控制块代码的语言与生成的文本的语言无关。 标准控制块标准控制块是生成输出文件部件的程序代码节。 您可以交错文本和代码,而不必使用显式 Write() 语句。 以下示例输出“Hello!”四次: 在代码中,可以使用 Write(); 语句的位置都可以插入文本块。 表达式控制块表达式控制块计算表达式并将其转换为字符串。 该字符串将插入到输出文件中。 <#= 2 + 3 #> 请注意,开始符号有三个字符“<#=”。 <#@ output extension=".txt" #> <# for(int i = 0; i < 4; i++) { #> This is hello number <#= i+1 #>: Hello! <# } #> 类功能控制块类功能控制块定义属性、方法或不应包含在主转换中的所有其他代码。 类功能块常用于编写帮助器函数。 通常,类功能块位于单独的文件中,这样它们可以包含在多个文本模板中。 <#@ output extension=".txt" #> Squares: <# for(int i = 0; i < 4; i++) { #> The square of <#= i #> is <#= Square(i+1) #>. <# } #> That is the end of the list. <#+ // Start of class feature block private int Square(int i) { return i*i; } #> 类功能必须编写在文件末尾。 不过,即使 include 指令后跟标准块和文本,也可以 <#@include#> 包含类功能的文件。 <# for(int i = 0; i < 4; i++) { WriteSquareLine(i); } #> End of list. <#+ // Class feature block private void WriteSquareLine(int i) { #> The square of <#= i #> is <#= i*i #>. <# } #> 将文本生成方法放置在可供多个模板包含的单独文件中,是非常有用的。 嗯,大概的基础点应该就这些了,更多的自己去MSDNhttp://msdn.microsoft.com/zh-cn/library/bb126445详细了解吧 这里解释点容易让人困惑的地方,我们在T4模版里面引用的程序集和那些命名空间都是利用T4生成代码需要使用的,也就是T4模版要用的,和我们要生成的目标类毛关系都没有,当初为搞清楚这点可是费了不精力。T4初看起来很复杂,其实稍微花些心思研究下,主要似乎把MSDN看懂还是很容易学会的,一旦掌握了受用无穷 |
|
来自: ThinkTank_引擎 > 《T4》