T4模板之初体验(语法)

一、什么是T4模板

T4是Text Template Transformation Toolkit(文本模板转换工具包)的四个英文首字母的简称。是微软提供的一种代码生成引擎。

在ADO.NET实体数据模型和EF框架中,那些根据数据库表结构自动生成的代码就是根据这种引擎来生成的,所以当我们对VS自动生成的代码不满意或有特殊需求,则可以修改T4模板来达到目的。

在VS2012中,通过下面步骤可以添加T4模板(以.tt为后缀名):

其中“文本模板”和“运行时文本模板”是微软提供的两种T4模板

当添加一个“文本模板”时,新建的文件中默认会有如下代码:

<#@ 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=".txt" #>

二、编写T4文本模板--语法

要学习如何进行T4模板的编写,首先需要了解T4模板的语法。

文本模板由下面三部分组成:

  • 指令:为文本模板转换引擎提供说明
  • 文本块:输出的内容
  • 控制块:向文本块中插入变量或循环等的一些程序代码

2.1指令

指令通常是模板文件或包含的文件中的第一个元素,其语法一般如下所示:<#@  指令名 [属性名=”属性值”] … #>

T4模板包含的指令有:模板指令、输出指令、参数指令、程序集指令、导入指令、包含指令

  • 模板指令

模板指令的一般格式如下:

<#@ template [language="VB"] [hostspecific="true|TrueFromBase"] [debug="true"] [inherits="templateBaseClass"] [culture="code"] [compilerOptions="options"] [visibility="internal"] [linePragmas="false"] #>template指令的所有属性如上所示,这些指令指定了转换的不同方面,并且都是可选的。language属性:有效值是:C#(默认)、VB。 用于指定模板中程序代码所使用的编程语言。hostspecific属性:有效值:true,false(默认),trueFromBase。

若设置为true,则会将名为 Host 的属性添加到由文本模板生成的类中,该属性是对转换引擎的宿主的引用,并声明为 ITextTemplatingEngineHost。

如果已经定义了自定义宿主,则可以将其转换为自定义宿主类型。(关于ITextTemplatingEngineHost的更多内容,请参考:

http://msdn.microsoft.com/zh-cn/library/vstudio/microsoft.visualstudio.texttemplating.itexttemplatingenginehost(v=vs.110).aspx

)

debug属性:有效值:true、false(默认)

如果 debug 特性为 true,则中间代码文件将包含使调试器能够更精确地识别模板中出现中断或异常的位置的信息。对于设计时模板,中间代码文件将写入您的 %TEMP% 目录。

inherits属性

指定模板的程序代码可以继承自另一个类,这个类也可以从文本模板生成。

  • 参数指令

parameter 指令声明模板代码中从自外部上下文传入的值初始化的属性。基本语法:<#@ parameter type="Full.TypeName" name="ParameterName" #>

如:<#@ template language="C#" #> <#@ parameter type="System.Int32" name="TimesToRepeat" #> <# for (int i = 0; i < TimesToRepeat; i++) { #> Line <#= i #> <# } #>

  • 输出指令

output 指令用于定义已转换文件的文件扩展名和编码。基本语法:<#@ output extension=".fileNameExtension" [encoding="encoding"] #>

注:每个文本模板中,不应该有多个output,extension的默认值为”.cs”如:<#@ output extension=".txt" #>

  • 程序集指令

assembly 指令可加载程序集,以便您的模板代码可使用其类型。该作用类似于在 Visual Studio 项目中添加程序集引用。

基本语法:<#@ assembly name="[assembly strong name|assembly file name]" #>,程序集名称应符合下述规范:

GAC 中程序集的强名称,例如 System.Xml.dll。 还可以使用长形式,例如 name="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"。

程序集的绝对路径

  • 导入指令

import 指令允许您在不提供完全限定名称的情况下引用另一个命名空间中的元素,等效于 C# 中的 using

基本语法:<#@ import namespace="namespace" #>

例如:<#@ import namespace="System.IO" #>

注:System命名空间会自动导入

  • 包含指令

通过使用 <#@include#> 指令可包括来自另一个文件的文本。基本语法:<#@ include file="filePath" [once="true"] #>

filePath可以是绝对路径,也可以是相对于模板的路径

2.2控制块

  • 标准控制块

用于控制输出的文件内容。包含在<# … #>标记中

例如:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".txt" #>

<#
   int top = 10;
   for(int i=0;i<=top;i++)
   {
#>
    The square of <#= i #> is <#= i*i #>
<# 
    }
#>

保存后会输出:

The square of 0 is 0
    The square of 1 is 1
    The square of 2 is 4
    The square of 3 is 9
    The square of 4 is 16
    The square of 5 is 25
    The square of 6 is 36
    The square of 7 is 49
    The square of 8 is 64
    The square of 9 is 81
    The square of 10 is 100

  • 表达式块

表达式控制块用于提供要写入输出文件的字符串的代码,用于变量值的输出。表达式块放于<#= … #>标记中

例如:

The square of <#= i #> is <#= i*i #> 会输出i的值和i*i的值

  • 类功能控制块

可以使用类功能控制块向文本模板添加方法、属性、字段甚至是嵌套类。类功能块最常用来为文本模板中其他部件的代码提供帮助器函数。放于<#+ … #>标记中,该标记需放于模板的最后。

例如:

<#+
private int DoubleNumber(int number)
{
return 2*number; }
#>

the double of <#= i #> is <#= DoubleNumber(i) #>

备注:上述三种标记是不能互相嵌套的。只能是完成一个标记后开启先的标记

2.3文本块

不包含与任何标识中的文本,如:this is the content。

2.4文本模板中的工具方法

  • 写入方法

Write() 和 WriteLine() 方法在标准代码块内追加文本,而不必使用表达式代码块

例如下面的两个代码块

使用表达式块的代码<#
int i = 10;
while (i-- > 0)
{ #>
<#= i #>
<# }
#>

使用WriteLine() 的代码块

<#
int i = 10;
while (i-- > 0)
{
WriteLine((i.ToString()));
}
#>

  • 缩进方法

PushIndent() 方法增加缩进;PopIndent() 方法减少缩进;ClearIndent() 方法删除所有缩进。

  • 错误和警告方法

Error()方法输出错误信息;Warning()方法输出警告信息。如:<#
try
{
string str = null;
Write(str.Length.ToString());
}
catch (Exception e)
{
Error(e.Message);
}
#>2.5 其他


指令名


参数说明


作用


$(ProjectName)


项目的基本名称


获取给定项目的路径


$(solutionName)


解决方案的名称


获取给定解决方案的路径

时间: 2024-08-02 06:42:10

T4模板之初体验(语法)的相关文章

学习C++模板,初体验

最近,看了很多码神级人物的代码,发现其代码很炫酷,尤其对模板的使用,作为小码农,感觉已经落伍了,所以应该发奋图强,好好学习和掌握模板这个东西. 模板是什么呢?有人说一个模板就是一个创建类或函数的蓝图或者公式,什么意思呢?就是说模板是创建类或者函数的母体或生成器,你给一些参数,模板就能够创建出一个类或者函数. 那么模板怎么定义呢?模板定义以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或者多个模板参数,用<>包围起来.for example: template <

C#代码生成工具:文本模板初体验 使用T4批量修改实体框架(Entity Framework)的类名

转自:http://www.cnblogs.com/huangcong/archive/2011/07/20/1931107.html 在之前的文本模板(T4)初体验中我们已经知道了T4的用处,下面就看看如何用它来实现批量修改实体框架(Entity Framework)中的类名.我们都知道ADO.NET 实体数据模型中有一种方式是以数据库模型来生成数据模型的,这是个很简便的实体数据模型生成的方式,但是因为微软提供的自定义接口不足,我们无法实现对生成的数据模型实体类批量进行修改(至少我上网找了很久

Java8初体验(二)Stream语法详解

原文链接:http://ifeve.com/stream/ 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的

Java8初体验(1):lambda表达式语法

原文出处: 一冰_天锦 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解偏差的地方,希望大家帮忙指出,我会持续修改和优化.本文是该系列的第一篇,主要介绍Java8对屌丝码农最有吸引力的一个特性—lambda表达式. java8的安装 工欲善其器必先利其器,首先安装JDK8.过程省略,大家应该都可以自己搞定.但是有一点这里强调一下(Windows系统):目前我们工作的版本一般是java 6或者java 7,所以很多人安

Java8初体验(2):Stream语法详解

原文出处: 一冰_天锦 上篇文章Java8初体验(1):lambda表达式语法比较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例子中有很多Stream的例子.这些Stream的例子可能让你产生疑惑,本文将会详细讲解Stream的使用方法(不会涉及Stream的原理,因为这个系列的文章还是一个快速学习如何使用的). 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequent

【转】Java8初体验(二)Stream语法详解

原文链接 http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 [email protected]上篇文章Java8初体验(一)lambda表达式语法比较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例子中有很多Stream的例子.这些Stream的例子可能让你产生疑惑,本文将会详细讲解Stream的使用方法(不会涉及Stream的原理,因为这个系列的文章还是一个快速学习如何使用的). 1. Str

语音识别之初体验

一.概述 作为最自然的人机交互方式 --语音,正在改变人们的生活,丰富多媒体技术的应用.语音识别技术是语音信号处理的一个重要分支,也是近年来很火的一个研究领域.随着科技的飞速发展,语音识别不仅在桌面PC和大型工作站得到了广泛应用,而且在嵌入式系统领域也占有一席之地,如智能家居.苹果的Siri.车载语音识别系统等.相信在不久的将来,语音识别技术必定会渗透在人们生活的每个角落. 二.语音识别系统的分类 语音识别按照说话人的说话方式可以分为孤立词(IsolatedWord)识别.连接词(Connect

PHP初体验

PHP初体验 提笔写初体验总不知道从何说起,直接聊PHP中的函数.PHP网络技术.数据库操作.PHP模板等感觉又不是初体验.最后还是决定从PHP的面向对象.PHP的魔术方法.PHP的反射.PHP中的异常和错误这4个方面简单介绍一下. PHP面向对象的“形”与“本” 这里我们就不给面向对象下定义了,不过我们还是要说一下类和对象的.类是对象的抽象组织,对象是类的具体存在.接下来我们就拿PHP为例,来探讨一下对象的“形”与“本”的问题. 在PHP中,每个类的定义都是以关键字class开头,后面是类名和

Node.js 网页瘸腿爬虫初体验

延续上一篇,想把自己博客的文档标题利用Node.js的request全提取出来,于是有了下面的初哥爬虫,水平有限,这只爬虫目前还有点瘸腿,请看官你指正了. // 内置http模块,提供了http服务器和客户端功能 var http=require("http"); // 内置文件处理模块 var fs=require('fs'); // 创建一个将流数据写入文件的WriteStream对象 var outstream=fs.createWriteStream('./1.txt'); /