功能强大的T4文本模版
期望你至少能意识到即便有代码自动生成器,但数据库结构变更等原因也会给大家带来不少的麻烦。这种直接放到项目里.tt文件有哪些好处自然不需要多说了。有特别的业务需要,在.用partial类来达成,免得模板文件自动更新代码时将手写的代码覆盖掉。
T4文本模版有什么用?什么时间用?
看一下下面这个示例你应该就会了解了:
新建一个控制台应用程序,删除里面的所有文件,新建一个Program.tt的文件,并输入如下内容:
<#@templatelanguage=C#debug=true#><#@outputextension=.csencoding=utf-8#><# stringClassName=Program; #>stringClassName=Program; #>namespaceHelloAngel { usingSystem; class<#=ClassName#>{ staticvoidMain { Console.WriteLine; } } }保存后大家会看到解决方法资源管理器中是这个样式的:
此时的Program.cs文件正是大家的Program.tt文件生成的,其内容如下:
namespaceHelloAngel { usingSystem; classProgram { staticvoidMain { Console.WriteLine; } } }看看下面两个指令:
<#@templatelanguage=C#debug=true#><#@outputextension=.csencoding=utf-8#><#@ template #>指令中language指定了大家模板运行用的语言,可以是VB,或C#,debug声明了是不是用调试,假如用不到调试,可以设置为false.
<#@ output #>指令中extension指定了输出文件的扩展名,encoding指定输出文件的编码策略。
也就是说,大家可以用C#语言来写此模板文件中的逻辑,模板将会输出一个与模板文件名相同,扩展名为.cs编码为utf-8的文件。
这里稍作认识下,下面看看指令的语法吧:
指令的语法如下所示:
<#@DirectiveName[AttributeName=AttributeValue]...#>需要将所有特质值放在双引号内。假如值本身包括引号,则需要用 字符对这类引号进行转义。
指令一般是模板文件或包括的文件中的第一个元素。不应将它们放置在代码块 <#...#> 内,也不应放置在类功能块 <#+...#> 之后。
T4 模板指令
<#@ template [language=VB] [hostspecific=true] [debug=true] [inherits=templateBaseClass] [culture=code] [compilerOptions=options] #>
T4 参数指令
<#@ parameter type=Full.TypeNamename=ParameterName#>
T4 输出指令
<#@ output extension=.fileNameExtension[encoding=encoding] #>
T4 程序集指令
<#@ as百度竞价推广bly name=[as百度竞价推广bly strong name|as百度竞价推广bly file name]#>
T4 导入指令
<#@ import namespace=namespace#>
T4 包括指令
<#@ include file=filePath#>
看了上面的指令后,就试着写个模板文件生成一些类来训练一下吧:
<#@templatelanguage=C#debug=true#><#@outputextension=.csencoding=utf-8#><#@importnamespace=System.Collections.Generic#><# List<List<string>classNames= newList<string> { Hello, Test }; List<string>callMethods=newList<string>; #>namespaceHelloAngel { usingSystem; <# foreach { callMethods.Add;,className)); #>foreach { callMethods.Add;,className)); #>class<#=className#>{ ///<summary>///<#=className#>的注解 ///