基于T4的生成方式
一、什么是T4模板
T4是对“Text Template Transformation Toolkit”(4个T)的简称。是一个基于文本文件转换的工具包。T4的核心是一个基于“文本模板”的转换引擎(以下简称T4引擎),我们可以通过它生成一切类型的文本型文件,比如我们常用的代码文件类型包括:C#、VB.NET、T-SQL、XML甚至是配置文件等。T4模板的定义非常简单,整个模板的内容包括两种形式:静态形式和动态动态。前者就是直接写在模板中作为原样输出的文本,后者是基于某种语言编写代码,T4引擎会动态执行它们。这和我们通过内联的方式编写的ASP.NET页面很相似:HTML是静态的,以C#或者VB.NET代码便写的动态执行的代码通过相应的标签内嵌其中。
二、T4模板的基本结构
假设我们用“块”(Block)来表示构成T4模板的基本单元,它们基本上可以分成5类:指令块(Directive Block)、文本块(Text Block)、代码语句块(Statement Block)、表达式块(Expression Block)和类特性块(Class Feature Block)。
1、指令块(Directive Block)
和ASP.NET页面的指令一样,它们出现在文件头,通过<#@…#>表示。其中<#@ template …#>指令是必须的,用于定义模板的基本属性,比如编程语言、基于的文化、是否支持调式等等。比较常用的指令还包括用于程序集引用的<#@ assembly…#>,用于导入命名空间的<#@ import…#>等等。
2、文本块(Text Block)
文本块就是直接原样输出的静态文本,不需要添加任何的标签。在上面的模板文件中,处理定义在<#… #>、<#+… #>和<#=… #>中的文本都属于文本块。比如在指令块结束到第一个“<#”标签之间的内容就是一段静态的文本块。
3、代码语句块(Statement Block)
代码语句块通过<#Statement#>的形式表示,中间是一段通过相应编程语言编写的程序调用,我们可以通过代码语句快控制文本转化的流程。在上面的代码中,我们通过代码语句块实现对一个数组进行遍历,输出重复的Console.WriteLine(“Hello, {0}”, “Xxx”)语句。
4、表达式块(Expression Block)
表达式块以<#=Expression#>的形式表示,通过它之际上动态的解析的字符串表达内嵌到输出的文本中。比如在上面的foreach循环中,每次迭代输出的人名就是通过表达式块的形式定义的(<#= person#>)
5、类特性块(Class Feature Block)
如果文本转化需要一些比较复杂的逻辑,我们需要写在一个单独的辅助方法中,甚至是定义一些单独的类,我们就是将它们定义在类特性块中。类特性块的表现形式为<#+ FeatureCode #>,对于Hello World模板,得到人名列表的InitializePersonList方法就定义在类特性块中。
《未完待续……》
最新文章
- primefaces4.0基本教程以及增删改查
- Kernel Function--核函数收集
- More on Conditions - To Compare -Comparing Sequences and Other Types
- IIS URL重写找不到页面 (URLRewriter.dll伪静态)
- Solr DIH dataconfig配置
- POJ2586Y2K Accounting Bug
- iOS开发——高级技术&;广告功能的实现
- C#经典之Application.DoEvents()的使用
- 利用Runtime给UITextView添加占位符(新方法)
- Day 1 Python简单程序
- ceph的正常卸载与非正常卸载
- three.js中的文字
- 让Apache和Nginx支持php-fpm模块
- LeetCode202:Happy Number 。C#版,在vs2010中通过,leetcode中Wrong Answer
- 遇到CloudFlare邮箱混淆,如何解密?
- Video 对象方法 canPlayType()
- Kubernetes报错Failed to get system container stats for ";/system.slice/kubelet.service";
- Oracle管理监控之oracle客户端链接服务器配置文档
- 一个用JS数组实现的队列
- ethers.js-2-wallets and signers
热门文章
- VMWare Workstation和VMWare vSphere(转)
- 程序包 javax.servlet 不存在 解决办法
- 一篇文章彻底弄清ARC始末
- extendgcd模板
- 问题:今天测试模块一直出现一个问题?module &#39;subprocess&#39; has no attribute &#39;Popen&#39;
- delete 和 truncate 的 区别
- 找出旋转有序数列的中间值python实现
- C#使用SQL语句时候的万用密码问题
- C#与数据库连接简单测试
- 10 个经典PHP函数