375750496
网站建设

[铜川网站建设].NET技术员不要错过这样强大的T4模板

发表日期:2024-07-21   作者来源:   浏览:0   标签:    

功能强大的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; } } }

保存后大家会看到解决方法资源管理器中是这个样式的:

[铜川网站建设].NET技术员不要错过这样强大的T4模板

此时的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#>的注解 ///