T4语法
阅读目录
1.什么是T4?
T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit。T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎。简单的说就是可以根据模板生成你想要的文件,可以使类文件,文本文件,HTML等等。
VS本身只提供一套基于T4引擎的代码生成的执行环境,由下面程序集构成:
Microsoft.VisualStudio.TextTemplating.10.0.dll
Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll
Microsoft.VisualStudio.TextTemplating.Modeling.10.0.dll
Microsoft.VisualStudio.TextTemplating.VSHost.10.0.dll
2.vs插件的安装
T4的编辑工具下载地址http://t4-editor.tangible-engineering.com/Download_T4Editor_Plus_ModelingTools.html
VS默认的编辑工具无高亮,无提示,错误不易定位。 没这个工具,真心不想写任何T4代码。
3.T4初体验
首先我们新建一个类库,在添加新项,选择文本文件,后缀名xx.tt.
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".cs" #> //------------------------------------------------------------------------------ // <博客园-枫伶忆 http://www.cnblogs.com/fenglingyi/> // 此代码由T4模板自动生成 // 生成时间 <#=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")#> by 枫伶忆 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 // QQ:549387177 // <博客园-枫伶忆 http://www.cnblogs.com/fenglingyi/> //------------------------------------------------------------------------------ using System; public class UserEntity { public string F_Id { get; set; } public string F_Account { get; set; } public string F_RealName { get; set; } public string F_NickName { get; set; } public string F_HeadIcon { get; set; } public bool? F_Gender { get; set; } public DateTime? F_Birthday { get; set; } public string F_MobilePhone { get; set; } public string F_Email { get; set; } public string F_WeChat { get; set; } public string F_ManagerId { get; set; } public int? F_SecurityLevel { get; set; } public string F_Signature { get; set; } public string F_OrganizeId { get; set; } public string F_DepartmentId { get; set; } public string F_RoleId { get; set; } public string F_DutyId { get; set; } public bool? F_IsAdministrator { get; set; } public int? F_SortCode { get; set; } public bool? F_DeleteMark { get; set; } public bool? F_EnabledMark { get; set; } public string F_Description { get; set; } public DateTime? F_CreatorTime { get; set; } public string F_CreatorUserId { get; set; } public DateTime? F_LastModifyTime { get; set; } public string F_LastModifyUserId { get; set; } public DateTime? F_DeleteTime { get; set; } public string F_DeleteUserId { get; set; } }
//------------------------------------------------------------------------------ // <博客园-枫伶忆 http://www.cnblogs.com/fenglingyi/> // 此代码由T4模板自动生成 // 生成时间 2016-10-02 07:09:29 by 枫伶忆 // 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。 // QQ:549387177 // <博客园-枫伶忆 http://www.cnblogs.com/fenglingyi/> //------------------------------------------------------------------------------ using System; public class UserEntity { public string F_Id { get; set; } public string F_Account { get; set; } public string F_RealName { get; set; } public string F_NickName { get; set; } public string F_HeadIcon { get; set; } public bool? F_Gender { get; set; } public DateTime? F_Birthday { get; set; } public string F_MobilePhone { get; set; } public string F_Email { get; set; } public string F_WeChat { get; set; } public string F_ManagerId { get; set; } public int? F_SecurityLevel { get; set; } public string F_Signature { get; set; } public string F_OrganizeId { get; set; } public string F_DepartmentId { get; set; } public string F_RoleId { get; set; } public string F_DutyId { get; set; } public bool? F_IsAdministrator { get; set; } public int? F_SortCode { get; set; } public bool? F_DeleteMark { get; set; } public bool? F_EnabledMark { get; set; } public string F_Description { get; set; } public DateTime? F_CreatorTime { get; set; } public string F_CreatorUserId { get; set; } public DateTime? F_LastModifyTime { get; set; } public string F_LastModifyUserId { get; set; } public DateTime? F_DeleteTime { get; set; } public string F_DeleteUserId { get; set; } }
上面的T4模板生成的代码类文件就是这样。T4所能做的事情远远超出这些,在这里我们首先了解一下T4的基本语法。
4.T4语法
细心的朋友刚才肯定看到了模板中的一些奇怪的语法,说它奇怪的是T4语法和c#语法类似,但是有不同于c#语法。
T4语法主要包括三类:1指令 2文本块 3指令块
<# 标准控制块 #> 可以包含语句。 <#= 表达式控制块 #> 可以包含表达式。 <#+ 类特征控制块 #> 可以包含方法、字段和属性,就像一个类的内部
指令主要包括template, output, assembly, import, include等类型
在这里是指令T4语法以<#开头结尾
<#@ 指令 属性=“值”#>
第一种指令集
4.1模板指令
<#@ template debug="false" hostspecific="false" language="C#" #>
4.1.1 langeuage:输出语言,有效值C#、VB,默认为C#
4.1.2 debug:是否启用调试,有效值true、false,默认为false。
4.1.3 hostspecific:有效值true、false,默认为false。如果将此特性的值设置为 true,则会将名为 Host 的属性添加到由文本模板生成的类中。 该属性是对转换引擎的宿主的引用,并声明为Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost。
4.1.4 inherits:可以指定模板的程序代码可以继承自另一个类,这个类也可以从文本模板生成。目前木有使用过,基本上可以忽略
4.2输出指令
<#@ output extension=".cs" #>
4.2.1 告诉T4引擎生成文件的后缀名是.cs;
<#@ assembly name="System"#>
4.3.1 告诉T4引擎编译运行时引用System程序集
$(SolutionDir):当前项目所在解决方案目录
$(ProjectDir):当前项目所在目录
$(TargetPath):当前项目编译输出文件绝对路径
$(TargetDir):当前项目编译输出目录,即web项目的Bin目录,控制台、类库项目bin目录下的debug或release目录(取决于当前的编译模式)
举个例子:比如我们在D盘根目录建立了一个控制台项目MyTest,解决方案目录为D:\Feng,项目目录为
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\
<#@ import namespace="System.Data"#>
4.4.1告诉T4引擎编译运行时引用某个名称空间。在 Visual Studio T4 文本模板的代码块中,import 指令允许您在不提供完全限定名称的情况下引用另一个命名空间中的元素。 它等效于 C# 中的 using 或 Visual Basic 中的 imports。默认已经导入了System命名空间的引用。
4.5包含指令
<#@ include file="Base.ttinclude"#>
4.5.1 运行时引用某个文件,类似于JS的引用。
4.5.2 包含指令可以提高代码复用率,比如我们可以将一些常用的程序集、命名空间引用放到一个文件里,使用时仅需要引用下即可,省去了每次都要重新引用一遍的烦恼,如我们建立Reference.ttinclude文件,里面包含了我们平时常用的程序集引用。
<#@ 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" #>
使用时只需要使用包含指令引用下即可
<#@ include file="$(ProjectDir)Reference.ttinclude" #>
4.6 参数指令
<#@ parameter type="string" name="ParameterName" #>
顾名思义就是定义一个参数在其他的地方使用。
第二种 文本块
文本块直接向输出文件插入文本。 文本块没有特殊格式,就像我们刚才初体验中写的类一样。
第三种 指令块
主要用于控制文本的输出。在控制块可以写任意的C#代码。
标准控制块:
<# for(int i = 0; i < 4; i++) { #> Hello World! <# } #>
表达式控制块:
<#= 1 + 1 #>
类控制块:
<#+ public class config { public static readonly string ConnectionString = "Data Source=(local);Initial Catalog=NFineBase;User ID=sa;Password=hjf19870810;"; public static readonly string DbDatabase = "NFineBase"; public static readonly string TableName = "Sys_Test"; } #>
例如在这里写一个类,在其他的地方我们可以使用这个类的东西。
其实对于“T4模板”的学习,讲得最详细的还是MSDN,下面给出对应的链接,可以点开深入的了解。
- T4 文本模板编写准则
- 使用 T4 文本模板生成设计时代码
- 演练:使用文本模板生成代码
- 生成过程中的代码生成
- 文本模板的安全性
- 使用 TextTransform 实用工具生成文件
- 使用 T4 文本模板的运行时文本生成
- 编写 T4 文本模板
- T4 文本模板指令
- T4 模板指令
- T4 参数指令
- T4 输出指令
- T4 程序集指令
- T4 导入指令
- T4 包含指令
- T4 CleanUpBehavior 指令
- 文本模板控制块
- 文本模板实用工具方法
- 从文本模板访问 Visual Studio 或其他主机
- 在文本模板中使用转义序列
- 如何:使用转义序列从模板生成模板
- 调试 T4 文本模板
- T4 文本模板编写准则
- 如何:使用文本模板 ...
- 自定义 T4 文本转换
- 文本模板转换过程
- 创建自定义 T4 文本模板指令处理器
- 部署自定义指令处理器
- 演练:创建自定义指令处理器
- 在 VS 扩展中调用文本转换
- 使用自定义宿主处理文本模板
- 演练:创建自定义文本模板宿主
- T4 文本模板的 API 参考
- 命名空间
- Microsoft.VisualStudio.TextTemplating
- Microsoft.VisualStudio.TextTemplating.Modeling
- Microsoft.VisualStudio.TextTemplating.VSHost