T4系列文章之1:认识T4
其实,我的原先的目的是因为我在做扩展UML的时候(因为我自己在弄通过UML的类图自动生成实体类型、方法和属性等等),它那里需要用到T4语言来进行写模板。所以,就抽了个时间把这些知识比较系统的看了看。
声明一下:本次系列的文章根据MSDN 的 T4介绍、Oleg Sych大师的文章以及自己的一些实战经验或者说自己的感悟吧。
写的不好之处,尽请谅解。有问题,多拍砖,多讨论。
一、导读
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( object sender, EventArgs e)
{
PreTextTemplate1 t4 = new PreTextTemplate1();
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系列文章之三:介绍T4语法
T4语言的语法很简单,可以说一学就会.它不像C#或Java一样有那么多的限制,所以,只要会C#语音,然后再学习一些T4应该注意的地方,那么就OK了. T4模板的基本结构可以分成5类:指令块(Direc ...
- 不干正事儿系列文章1:Sonic Pi简单应用
文章目录 Sonic Pi简单应用 0. Intro 1. Sonic Pi简单介绍 1.1 安装 1.2 案例 2. Sonic Pi和随机数 2.1 和弦的生成 2.2 旋律的生成 2.3 歌曲中 ...
- 数据结构学习系列文章合集
数据结构学习系列文章目录 前言 1.稀疏数组和队列 稀疏数组和二位数组的转换 数组队列的实现 环形队列的介绍与实现 2.链表 单链表的增.删.改.查 总结 前言 学习数据结构记录,作为自己的笔记,同时 ...
- 积少成多 Flash(ActionScript 3.0 Flex 3.0) 系列文章索引
[源码下载] 积少成多 Flash(ActionScript 3.0 & Flex 3.0) 系列文章索引 作者:webabcd Flash 之 ActionScript 3.0 1.积少成 ...
- Scott的ASP.net MVC框架系列文章之四:处理表单数据(2)
前几周我发表了一系列文章介绍我们正在研究的ASP.NET MVC框架.ASP.NET MVC框架为你提供了一种新的开发Web应用程序的途径,这种途径可以让应用程序变得更加层次清晰,而且更加有利于对代码 ...
- Enterprise Library系列文章回顾与总结
Enterprise Library系列文章回顾与总结 自Enterprise Library 1.1 推出以来,Terry写了一系列的关于Enterprise Library的文章,其中得到了很多朋 ...
- 系列文章|OKR与敏捷(三):赋予团队自主权
OKR与敏捷开发的原理有着相似之处,但已经使用敏捷的团队再用OKR感觉会显得多余.这种误解的根源就在于对这两种模式不够了解,运用得当的情况下,OKR和敏捷可以形成强强联合的效果,他们可以创造出以价值为 ...
- 系列文章|OKR与敏捷(二):实现全栈敏捷
OKR与敏捷开发的原理有着相似之处,但已经使用敏捷的团队再用OKR感觉会显得多余.这种误解的根源就在于对这两种模式不够了解,运用得当的情况下,OKR和敏捷可以形成强强联合的效果,他们可以创造出以价值为 ...
- C#网络编程系列文章索引
1. 网络协议简介 介绍了网络分层: 网络层 数据链路层 网络层 传输层 应用层 2. HTTP协议详解 介绍应用层的HTTP协议,是Asp.net开发人员必须掌握的协议 HTTP请求 HTTP响应 ...
最新文章
- GitLab 8.15中引入了自动部署和Web终端
- 情绪管理的快速实践方法---视频学习记录
- Chrome 技术篇-console控制台检测xpath、css唯一性
- 普通程序员如何转向AI方向
- 双十一消费近万亿!1亿人见证数字物流,“尾款人”收货更快了?购物狂欢七大趋势浮现
- Java_基础—try...catch的方式处理异常1
- 列举5个python内置函数和使用方法_Python基础-----函数、内置函数、递归等练习
- 老码农的Java干货资源
- Intel® Nehalem/Westmere架构/微架构/流水线 (5) - 高速缓存 存储器子系统
- android消息队列模型,Android 消息队列机制
- java数组移除对象_如何从Java数组中删除对象?
- 声道测试音频_功率放大器测试方法
- 汽车后市场的大数据引擎谁人可造
- 2008 r2 server sql 中文版补丁_sql2008 sp4补丁
- Android 计时器
- 【游戏开发实战】Unity实现水果忍者切水果的刀痕效果教程(两种实现方式:TrailRenderer、LineRenderer)
- Android App 增量更新实例(Smart App Updates)
- UC号、百家号,为什么这些科技公司都押注“内容”?
- 直播安全体系、播放安全、推流安全以及内容安全方案分享
- SpringCloud动态获取yml文件中的配置
热门文章
- CentOS-VIM显示行号
- Linux配置USB RNDIS
- 面试官:熟悉SQL优化吗?我只知道20种,其实远不止...
- 游戏物体GameObject
- QT5/C++项目:基于QT的跨平台网络对战象棋(一)(推荐★★★★)
- 玩转基因组浏览器之展示RNA二级结构
- 微信截图无法发送,也发不出电脑上的图片
- 2022前端面经---(js高级)一文让你搞懂闭包
- 《智能控制技术》学习笔记-2.1,模糊集合论基础、模糊逻辑、模糊逻辑推理和合成
- 有N个学生,学号,姓名,性别,四门课成绩,键盘上输入信息,输出总平均分成绩最高