其实,我的原先的目的是因为我在做扩展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语法进行梳理讲解一下。

作者:Lanny☆兰东才
出处:http://www.cnblogs.com/damonlan
Q Q:*********
E_mail:Damon_lan@163.com or Dongcai.lan@hp.com

本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。

T4系列文章之1:认识T4相关推荐

  1. T4系列文章之三:介绍T4语法

    T4语言的语法很简单,可以说一学就会.它不像C#或Java一样有那么多的限制,所以,只要会C#语音,然后再学习一些T4应该注意的地方,那么就OK了. T4模板的基本结构可以分成5类:指令块(Direc ...

  2. 不干正事儿系列文章1:Sonic Pi简单应用

    文章目录 Sonic Pi简单应用 0. Intro 1. Sonic Pi简单介绍 1.1 安装 1.2 案例 2. Sonic Pi和随机数 2.1 和弦的生成 2.2 旋律的生成 2.3 歌曲中 ...

  3. 数据结构学习系列文章合集

    数据结构学习系列文章目录 前言 1.稀疏数组和队列 稀疏数组和二位数组的转换 数组队列的实现 环形队列的介绍与实现 2.链表 单链表的增.删.改.查 总结 前言 学习数据结构记录,作为自己的笔记,同时 ...

  4. 积少成多 Flash(ActionScript 3.0 Flex 3.0) 系列文章索引

    [源码下载] 积少成多 Flash(ActionScript 3.0 & Flex 3.0) 系列文章索引 作者:webabcd Flash 之 ActionScript 3.0  1.积少成 ...

  5. Scott的ASP.net MVC框架系列文章之四:处理表单数据(2)

    前几周我发表了一系列文章介绍我们正在研究的ASP.NET MVC框架.ASP.NET MVC框架为你提供了一种新的开发Web应用程序的途径,这种途径可以让应用程序变得更加层次清晰,而且更加有利于对代码 ...

  6. Enterprise Library系列文章回顾与总结

    Enterprise Library系列文章回顾与总结 自Enterprise Library 1.1 推出以来,Terry写了一系列的关于Enterprise Library的文章,其中得到了很多朋 ...

  7. 系列文章|OKR与敏捷(三):赋予团队自主权

    OKR与敏捷开发的原理有着相似之处,但已经使用敏捷的团队再用OKR感觉会显得多余.这种误解的根源就在于对这两种模式不够了解,运用得当的情况下,OKR和敏捷可以形成强强联合的效果,他们可以创造出以价值为 ...

  8. 系列文章|OKR与敏捷(二):实现全栈敏捷

    OKR与敏捷开发的原理有着相似之处,但已经使用敏捷的团队再用OKR感觉会显得多余.这种误解的根源就在于对这两种模式不够了解,运用得当的情况下,OKR和敏捷可以形成强强联合的效果,他们可以创造出以价值为 ...

  9. C#网络编程系列文章索引

    1. 网络协议简介 介绍了网络分层: 网络层 数据链路层 网络层 传输层 应用层 2. HTTP协议详解 介绍应用层的HTTP协议,是Asp.net开发人员必须掌握的协议 HTTP请求 HTTP响应 ...

最新文章

  1. GitLab 8.15中引入了自动部署和Web终端
  2. 情绪管理的快速实践方法---视频学习记录
  3. Chrome 技术篇-console控制台检测xpath、css唯一性
  4. 普通程序员如何转向AI方向
  5. 双十一消费近万亿!1亿人见证数字物流,“尾款人”收货更快了?购物狂欢七大趋势浮现
  6. Java_基础—try...catch的方式处理异常1
  7. 列举5个python内置函数和使用方法_Python基础-----函数、内置函数、递归等练习
  8. 老码农的Java干货资源
  9. Intel® Nehalem/Westmere架构/微架构/流水线 (5) - 高速缓存 存储器子系统
  10. android消息队列模型,Android 消息队列机制
  11. java数组移除对象_如何从Java数组中删除对象?
  12. 声道测试音频_功率放大器测试方法
  13. 汽车后市场的大数据引擎谁人可造
  14. 2008 r2 server sql 中文版补丁_sql2008 sp4补丁
  15. Android 计时器
  16. 【游戏开发实战】Unity实现水果忍者切水果的刀痕效果教程(两种实现方式:TrailRenderer、LineRenderer)
  17. Android App 增量更新实例(Smart App Updates)
  18. UC号、百家号,为什么这些科技公司都押注“内容”?
  19. 直播安全体系、播放安全、推流安全以及内容安全方案分享
  20. SpringCloud动态获取yml文件中的配置

热门文章

  1. CentOS-VIM显示行号
  2. Linux配置USB RNDIS
  3. 面试官:熟悉SQL优化吗?我只知道20种,其实远不止...
  4. 游戏物体GameObject
  5. QT5/C++项目:基于QT的跨平台网络对战象棋(一)(推荐★★★★)
  6. 玩转基因组浏览器之展示RNA二级结构
  7. 微信截图无法发送,也发不出电脑上的图片
  8. 2022前端面经---(js高级)一文让你搞懂闭包
  9. 《智能控制技术》学习笔记-2.1,模糊集合论基础、模糊逻辑、模糊逻辑推理和合成
  10. 有N个学生,学号,姓名,性别,四门课成绩,键盘上输入信息,输出总平均分成绩最高