T4系列文章之1:认识T4
一、导读
MSDN:Code Generation and T4 Text Templates
博客园:编写T4模板进行代码生成
Oleg Sych系列文章:http://www.olegsych.com/2007/12/text-template-transformation-toolkit/
我先前写的有关T4在MVC 里的运用 :MVC T4 扫盲贴
二、有关T4的简介
我和我的同事讨论这个问题的时候,刚开始很多人不懂T4是什么玩意,其实T4语言,它指的是4个t开头的英文字母---Text Template Transformation Tookit ,即 文本模板转换工具。
T4 模板语言是一个模板代码生成语言,什么意思呢?就是通过模板,生成我们相应的所需要的文件。很好理解,比如我们在写类的时候,我们通常是新建一个类文件,这个时候它出来的页面并非空白,而是有一些基本的内容,比如我新建一个 MyTest的类文件:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace BLL
{
class MyTest
{
}
}
所以,上面的这些常用的信息就是用模板语言来进行新建的。
T4 模板语言的后缀以.tt结尾的,我们可以在 VS 2008 或 VS 2010里面进行使用。如下图:

看到了木有,第一个“预处理的文本模板”和第二个是文本模板。
介绍2中模板的用途:
One .预处理的文本模板
先说说这个,这个是设计时的模板。可以在运行时在应用程序中生成文本字符串。 预处理过的模板有时称为“运行时文本模板”。什么是运行时模板呢?其实,也很好理解,比如我们在写C#代码的时候,我们也分为运行时的编译还是设计时,运行时就是在程序开始执行的时候才开始,而设计时是说你在写代码那一刻就开始编译。更具体的例子说,假如我们有一个错误,如果编译时错误,那么我们写完离开就会显示出来,可是有些错误在编译的时候,是无法知道的,比如说内存泄露等等,这个必须要等程序运行的时候才能知道。
一般来说,预处理模板在项目中的使用比较大,因为它有一个partial的分部类,我们都知道,在VS里面为了便于对某些元素进行扩展,很多时候都使用的分部类。这里也不例外。而且我目前做的通过UML 类图生成代码 都是通过partial来进行扩展的。
我们可以看到,它和文本模板(第二点会介绍)属性的唯一不同便是:自定义工具的值不同。预处理的是:TextTemplatingFilePreprocessor
文本的是:TextTemplatingFileGenerator
现在先建立预处理的文件,对于它的一些语法,我们暂时先不考虑,语法我们会在下一节进行说明。
将创建一个扩展名为 .tt 的新文件。该文件的“自定义工具”属性设置为 TextTemplatingFilePreprocessor。如下图:

具体操作过程如下:
1.在解决方案资源管理器中,右击项目,指向“添加”,再单击“新建项”。
2.在“添加新项”对话框中,选择“预处理文本模板”。(在 Visual Basic 中的“常用项\常规”下查看。)
3.键入模板文件的名称。
这里需要注意的一点是,模板文件名将在生成的代码中用作类名。因此,该名称不应包含空格或标点。
4.单击“添加”。可以了,到这一步就OK了。
然后会看到只有一行代码:<#@ template language="C#" #>
现在我们,在这行代码的下面放入以下代码:
<#@ output extension=".html" #>
<h1>列出所有数字:</h2>
<table>
<# for (int i = 1; i <= 10; i++)
{
#>
<tr><td>数字: <#= i #> </td>
<td>倍数: <#= i * i #> </td> </tr>
<# } #>
</table>
我们现在只需要知道的是,它输出的类型是.html,extension=".html",即表明它输出的是网页文件。
那我们怎么看它呢?
比如我们需要在aspx里调用这个模板文件,那么我只需要在需要触发事件的方法下面调用这个就OK,比如我这里是在page_load的时候,把模板里的内容显示到页面上。
protected void Page_Load(objectsender, EventArgs e)
{
PreTextTemplate1 t4 = newPreTextTemplate1();
string str = t4.TransformText();
t4Div.InnerHtml = str;
}
页面,我放了一个div,如<div id="t4Div" runat="server"></div>,把runat设为server是为了在后台能调用,当然你也可以用其他空间进行渲染。
你还可以在控制台进行显示,调用方法也和上面一样。比如在控制台输出的内容为:

很酷吧。暂时先体验一下吧。
好了,接下来我们来说说文本模板。
Two.文本模板

如上图所示,文本模板里的自定义工具是:TextTemplatingFileGenerator
文本模板是一种在设计时显示的结果的一种模式.也就是所见所得的一种模式吧。
1.生成html文件
比如我现在还是上面的代码,新建一个文本模板,然后再下面写入一下代码:
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".html" #>
<html><body>
<h1>Sales for Previous Month</h2>
<table>
<# for (int i = 1; i <= 10; i++)
{ #>
<tr><td>Test name <#= i #> </td>
<td>Test value <#= i * i #> </td> </tr>
<# } #>
</table>
This report is Company Confidential.
</body></html>
这个 结果怎么看呢?很简单,你只需要展开TextTemplate1.tt,你会看到一个TextTemplate1.html(因为你上面的output设置了.html)文件。
2.生成文本文件
<#@ output extension=".txt" #>
列出数字从1 到 10:
<#
int list=10;
for(int i=0;i<10;i++){
#><#= i #><#= } #>
它和上面的唯一的区别就是output的不一样。查看方式也很easy哦。
3. 生成类文件
你还可以生成类文件,它主要的都合上面的一样,唯一的区别就是output的输出类型是.cs文件。
<#@ output extension=".cs" #>
<# var properties = new string [] {"P1", "P2", "P3"}; #>
class MyGeneratedClass {
<#
foreach (string propertyName in properties)
{ #>
private int <#= propertyName #> = 0;
<# } #>
}
生成
class MyGeneratedClass {
private int P1 = 0;
private int P2 = 0;
private int P3 = 0;
}
呵呵 我们这里模拟了类文件的生成,你此刻想到什么了?
三 总结
OK,T4的基本介绍就先到这里。可能在这里你有好些地方,比如说T4的语法等等,木有关系,我会在下一节中对T4语法进行梳理讲解一下。
出处:http://www.cnblogs.com/damonlan
Q Q:*********
E_mail:Damon_lan@163.com or Dongcai.lan@hp.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
T4系列文章之1:认识T4的更多相关文章
- [转]T4系列文章之3:T4语法的介绍
本文转自:http://www.cnblogs.com/damonlan/archive/2012/03/06/2382724.html 因为这段时间一直都没空,我也不知道有没有对人T4感兴趣,但不管 ...
- T4系列文章之2:T4工具简介、调试以及T4运行原理(转)
出处:http://www.cnblogs.com/damonlan/archive/2012/01/12/2320429.html 一.前言 经过第一篇,我想大家现在对T4有了基本的印象,应该对T4 ...
- T4系列文章之2:T4工具简介、调试以及T4运行原理
一.前言 经过第一篇,我想大家现在对T4有了基本的印象,应该对T4有了一个大致的了解吧.现在,我们接着来讲一下T4的工具,然后下一篇我就开始T4的用法了.各位客官,就等了. 二.工具介绍 2.1 上图 ...
- 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录
ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视频:ABP架构设计交流群-7月18日上海线下交流会的内容分享(有高清录像视频的链接) 代码自动生成: ...
- 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)
统计角度窥视模型概念 作者:白宁超 2016年7月18日17:18:43 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量. ...
- 【微信小程序开发•系列文章六】生命周期和路由
这篇文章理论的知识比较多一些,都是个人观点,描述有失妥当的地方希望读者指出. [微信小程序开发•系列文章一]入门 [微信小程序开发•系列文章二]视图层 [微信小程序开发•系列文章三]数据层 [微信小程 ...
- SQL Server 系列文章快速导航(SWF版)
一.前言 在博客园写博客不自不觉已经有5个年头了,一开始只是为了记录工作中遇到的问题和解决办法,后来写的文章不自不觉的侧重在SQL Server方面的技术文章,在2014年1月终于鼓起勇气申请了微软S ...
- Geotrellis系列文章链接
本文存放了我在博客园中撰写的Geotrellis系列文章链接,方便查阅! 一.geotrellis使用初探 二.geotrellis使用(二)geotrellis-chatta-demo以及geotr ...
- 如何实现一个php框架系列文章【开篇】
1.本系列文章的目的 实现一个小而美的产品级别php框架 自己动手实现一个新框架仅用于学习交流,不打算替代市面上现有的其他主流框架. 2. 我要一个怎样的PHP框架 简单实用,安全优雅,博采众长 安装 ...
随机推荐
- Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead的解决的方法
今天在eclipse里报这个错误: Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead. Plea ...
- ubuntu终端白屏的解决方法
昨天突发奇想的想为teminal设置一个背景, 这样.... 不过过了一会就高兴不起来了,,,,终端白屏!好吧,现在我页没办法彻底解决, 不过暂时的一个方法是可以把首选项->背景->背景图 ...
- AtCoder Regular Contest 069
1. C - Scc Puzzle 计算scc的个数,先判断s个数需要多少个cc,多的cc,每四个可以组成一个scc.注意数据范围,使用long long. #include<bits/stdc ...
- 文档控件NTKO OFFICE 详细使用说明之预览word编辑保存回服务器
1.在线预览Word文件 (1) 运行环境 ① 浏览器:支持IE7-IE11(平台版本还支持Chrome和Firefox) ② IE工具栏-Internet 选项:将www.ntko.com加入到浏览 ...
- angular中的ng-click指令案例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 1350 Taxi Cab Scheme DAG最小路径覆盖
对于什么是DAG最小路径覆盖以及解题方法在我的另外的博客已经有了.http://www.cnblogs.com/Potato-lover/p/3980470.html 此题的题意: 公交车(出租车)车 ...
- mac 下安装 mariadb
通过brew 安装: brew install mariadb 初始化数据库 cd /usr/local/Cellar/mariadb/10.0.10/scripts mysql_install_db ...
- 我的新书《计算机图形学基础(OpenGL版)》
我的新书<计算机图形学基础(OpenGL版)>今年6月份在清华大学出版社出版了!新书与原在机械工业出版社出的<计算机图形学>相比,主要有以下不同: 1.加重OpenGL的内容, ...
- 关于maven-基本
笔记 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object ...
- 05《UML大战需求分析》之五
调研需求的时候,用户会说这个软件要具备怎样的功能,能做什么事情等,这些是功能性的需求.部署图和构件图是用来描述软件架构的,但是我又怀疑软件需求调研也需要确定软件架构吗? 我阅读了一个例子,一个软件公司 ...