T4(Text Template Transformation Toolkit)在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。
T4 文本模板有两种类型:
若要创建运行时模板,请向您的项目中添加“已预处理的文本模板”文件。
另外,您还可以添加纯文本文件并将其“自定义工具”属性设置为“TextTemplatingFilePreprocessor”。
在 Visual Studio 中执行设计时 T4 文本模板,以便定义应用程序的部分源代码和其他资源。
通常,您可以使用读取单个输入文件或数据库中的数据的多个模板,并生成一些 .cs、.vb 或其他源文件。
每个模板都生成一个文件。 在 Visual Studio 或 MSBuild 内执行它们。
若要创建设计时模板,请向您的项目中添加“文本模板”文件。 另外,您还可以添加纯文本文件并将其“自定义工具”属性设置为“TextTemplatingFileGenerator”。
最简单的HelloWorld,通过此例子,可以看到T4的基本结构
<#@ template debug="false" hostspecific="false" language="C#" #> <#@ output extension=".cs" #> <#@ import namespace="System" #> <#@ import namespace="System.Collections.Generic" #> using System; namespace Test { public class HelloWorld { public static void Main(string[] args) { <# List<Person> people = GetPersonList(); foreach(Person p in people) { #> Console.WriteLine("Hello {0},Welcome to T4 World!","<#= p.Name #>"); <#} #> } } } <#+ //类 public class Person { ///名称 public string Name{ get; set; } public Person(string name) { this.Name = name; } } //初始化众人 public List<Person> GetPersonList() { List<Person> people = new List<Person>(); Person p1 = new Person("Tom"); Person p2 = new Person("Jim"); Person p3 = new Person("Lucy"); people.Add(p1); people.Add(p2); people.Add(p3); return people; } #>
生成的代码:
using System; namespace Test { public class HelloWorld { public static void Main(string[] args) { Console.WriteLine("Hello {0},Welcome to T4 World!", "Tom"); Console.WriteLine("Hello {0},Welcome to T4 World!", "Jim"); Console.WriteLine("Hello {0},Welcome to T4 World!", "Lucy"); } } }
代码块的总体分类,就是两种:文本、程序脚本。
为了细分语法,方便大家更好的理解,用“块”(Block)来表示构成T4模板的基本单元,它们基本上可以分成5类:指令块(Directive Block)、文本块(Text Block)、代码语句块(Statement Block)、表达式块(Expression Block)和类特性块(Class Feature Block)。
和ASP.NET页面的指令一样,它们出现在文件头,通过<#@…#>表示。其中<#@ template …#>指令是必须的,用于定义模板的基本属性,比如编程语言、基于的文化、是否支持调式等等。比较常用的指令还包括用于程序集引用的<#@ assembly…#>,用于导入命名空间的<#@ import…#>等等。
指令通常是模板文件或包含的文件中的第一个元素。不应将它们放置在代码块 <#...#> 内,也不应放置在类功能块 <#+...#> 之后。
文本块就是直接原样输出的静态文本,不需要添加任何的标签。
代码语句块通过<#Statement#>的形式表示,中间是一段通过相应编程语言编写的程序调用,我们可以通过代码语句快控制文本转化的流程。在上面的代码中,我们通过代码语句块实现对一个数组进行遍历,输出重复的Console.WriteLine("Hello {0},Welcome to T4 World!","<#= p.Name #>");语句。
表达式块以<#=Expression#>的形式表示,通过它之动态的解析的字符串表达内嵌到输出的文本中。比如在上面的foreach循环中,每次迭代输出的人名就是通过表达式块的形式定义的(<#= p.Name #>)
如果文本转化需要一些比较复杂的逻辑,我们需要写在一个单独的辅助方法中,甚至是定义一些单独的类,我们就是将它们定义在类特性块中。类特性块的表现形式为<#+ FeatureCode #>,对于Hello World模板,得到人名列表的GetPersonList方法就定义在类特性块中。
原文:https://www.cnblogs.com/springsnow/p/10362484.html