前言
t4模板是vs里用于生成代码的一个模板工具,可以对模板编写达到一键生成自己想要代码的目的。
首先,先看一下T4模板的简介。
简介
文本模板包含将从其生成的文本。 例如,用于创建网页的模板将包含 " …"以及 HTML 页的所有其他标准部分。 插入到模板中的是 控制块,它们是程序代码的片段。 控制块提供变化值,允许文本部件是条件和重复的。
使用这一结构很容易开发模板,因为可以以生成文件为原型,然后逐步插入用于改变结果的控制块。
文本模板由以下部件组成:
- 指令 -控制如何处理模板的元素。
- 文本块 -直接复制到输出的内容。
- 控制块 -将变量值插入到文本中并控制文本的有条件或重复部分的程序代码。
然后,我们看一下流程。
流程
1.选择t4模板存放目录
右键 ->添加 ->新建项
或者 ctrl +shift +A
选择文本模板
创建完成
模板内容
内容
这里包含了几个默认项目
-
Template 指令:<#@ template debug=“false” hostspecific=“false” language=“C#” #>
里面包含了几个参数:- debug:没啥用,会导致vs卡死,如果想要调试模板,在模板文件右键,选择t4模板调试。
- hostspecific:可以获取Host内容,需要获取解决方案信息的时候,需要将其设置为true。
- language:声明脚本使用的语言。
非自带参数: - compilerOptions :编译器选项(我没用过)有效值是任何有效编译器选项
- culture :表示为 xx-XX 形式字符串的区域性。 例如:en-US、ja-JP、de-CH、de-DE。 有关详细信息,请参阅 System.Globalization.CultureInfo
- inherits :可以指定模板继承自另一个类
- linePragmas :调试用,将此特性设置为 false 将移除标识你在生成代码中的行号的标记。 这意味着,编译器将通过使用生成代码的行号来报告所有错误。这将为你提供更多调试选项,如你可选择调试文本模板或生成代码。(没用过)
- visibility :可见性
Template 指令不是必须,可以没有
-
程序集指令<#@ assembly name=“System.Core” #>
表示使用的程序集。 -
导入指令<#@ import namespace=“System.Linq” #>
相当于using -
输出指令<#@ output extension=".txt" #>
表示输出文件后缀
还有一些未包含的如
- 参数指令:<#@ parameter type=“Full.TypeName” name=“ParameterName” #>
示例:<#@ parameter type=“System.Int32” name=“TimesToRepeat” #>
可以声明所用参数<# for (int i = 0; i < TimesToRepeat; i++) { #> Line <#= i #> <# } #>
- 包含指令:<#@ include file=“filePath” [once=“true”] #>
可以应用其他的文件(我只引用了t4文件,其他请自行尝试) - CleanUpBehavior 指令 若要在处理文本模板之后删除 appDomain,请包括以下行:<#@ CleanupBehavior processor=“T4VSHost” CleanupAfterProcessingtemplate=“true” #>(我没用到)
语法
模板的语法基本就是<#(内容) #>,代码的语法看使用的language,我这里使用的c#便用的是c#的语法。c#的类都可以使用,前提是要在指令中进行引用。
赋值使用的是<#= (变量)#>
打印内容
<# #>以外的内容都是打印内容
也就是说,你可以直接将你的模板类,复制粘贴过来,加上指令头,然后用<# #>和<#= #>修改其中的变量就可以了
下面写一个简单例子方便理解
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
//要实现的类
<#
//我想定义个变量
var imvar = "我是变量";
#>
public class test{
public string <#=imvar#> { get; set; }
}
这样就会生成
你在<# #>中定义的变量就可以用<#= #>进行值得替换。
假如需要循环,可以这么写
<#
var list = new List<string>();
list.Add("一号"),
list.Add("二号")
foreach(var i in list){
#>
public string <#=i#>
<#
}
#>
这里就是把循环里的括号拆开,添加进去模板值,虽然看起来很难看,但是很好理解。