[转]T4系列文章之3:T4语法的介绍
本文转自:http://www.cnblogs.com/damonlan/archive/2012/03/06/2382724.html
因为这段时间一直都没空,我也不知道有没有对人T4感兴趣,但不管了,先记下在说吧,就当是我的笔记。
希望对你们有用。
如果你对T4还比较陌生,推荐你在复习几篇文章:
One:T4系列文章之1:认识T4
Two:T4系列文章之2:T4工具简介、调试以及T4运行原理
复习复习。。
T4语言的语法很简单,可以说一学就会。它不像C#或者JAVA一样,那么多的限制什么的。所以,只要会C#语言,然后再学习一点T4它应该注意的地方,那么就OK了。
是不是很心动了?心动不如行动吧。
T4模板的基本结构: 它们基本上可以分成5类:指令块(Directive Block)、文本块(Text Block)、代码语句块(Statement Block)、表达式块(Expression Block)和类特性块(Class Feature Block)。
你看上面的截图,把一些基本的都罗列出来了。
1、指令块(Directive Block)
首先,值需要记住的是 指令块是已@开头的。 比如你看到的下面。
和ASP.NET页面的指令一样,它们出现在文件头,通过<#@…#>表示。其中<#@ template …#>指令是必须的,用于定义模板的基本属性,比如编程语言、基于的文化、是否支持调式等等。比较常用的指令还包括用于程序集引用的<#@ assembly…#>,用于导入命名空间的<#@ import…#>等等。
它主要包括以下内容:
1. <#@ import#>
开头,这个主要表示是说引入命名空间 比如:<#@ import namespace="System.Linq" #>
2. <#@ assembly name="[assembly strong name|assembly file name]" #>
顾名思义 指的是 引入ddl文件,比如<#@ assembly name="System.Core.dll" #>。不过这里其实没有必要,因为你只要在当前的引用里添加dll文件就ok了。 3. <#@ output extension="" #>
这个是你输出的格式,比如<#@ output extension=".cs" #>,那么你输出的就是.cs文件咯。很好理解。Extension是扩展名的意思嘛。
5. <#@ template #>
格式:<#@ template [language="VB"] [hostspecific="true"] [debug="true"] [inherits="templateBaseClass"] [culture="code"] [compilerOptions="options"] #>
它主要有2个意思:一个只的是写模板所使用的语言,比如<#@ template language="C#" #> 那么我这个模板可以用C#来些。
另一个很重要的特性指的是:继承。就是把一些公共的方法抽象到父模板中,然后可以在多个模板中进行复用。这个非常有用,我以后会逐步的介绍。 比如:<#@ template language="C#" inherits="CommonTemplate" debug="true" #> CommonTemplate是我写的一个公共模板。
6. <#@ include file="" #>
这个很有意思,意思就是说在当前的模板中包含另外一个文件中的内容。先来一个很简单的例子。
6.1 新建一个空白的文本模板 ,命名为:MyTextTemplate.tt
6.2 在新建一个 txt文件,里面写入一些字。myText.txt
6.3 在MyTextTemplate.tt模板中,<#@ include file=”myText.txt”#>
6.4 然后你就可以在MyTextTemplate.tt看到 你文本中的一些字符。
对第六点需要的注意事项:
- file的路径可以是绝对路径、相对路径。
2.file可以包括环境变量,但它必须用%包起来。比如<#@ include file="%HOMEPATH%\MyIncludeFile.t4" #>
3.file后面的文件的扩展名不能包括 .tt结尾的。
如果你需要用.tt的结尾,你需要用4t来代替。这是因为如果你加了.tt后缀的文件名,因为vs会自动是把当前.tt的文件的Custom Tool(自定义工具)属性设定为TextTemplatingFileGenerator。
2、文本块(Text Block)
文本块就是直接原样输出的静态文本,不需要添加任何的标签。在上面的模板文件中,处理定义在<#… #>、<#+… #>和<#=… #>中的文本都属于文本块。比如在指令块结束到第一个“<#”标签之间的内容就是一段静态的文本块。
模板内容:
<#@ template language= "C#" #> Hello World! |
编译的内容:
using System; using Microsoft.VisualStudio.TextTemplating; namespace Microsoft.VisualStudio.TextTemplating413AE4BE2CE28AB99 { public class GeneratedTextTransformation: TextTransformation { public override string TransformText() { this .Write( "Hello World!" ); return this .GenerationEnvironment.ToString(); } } } |
输出是:Hello World!
3、代码语句块(Statement Block)
代码语句块通过<#Statement#>的形式表示,中间是一段通过相应编程语言编写的程序调用,我们可以通过代码语句快控制文本转化的流程。
其实在我们的使用中,对语句块的作用主要就是写C#代码。
比如,请看下面:
<# for ( int i = 0; i < 4; i++) { Write(i + ", " ); } Write( "4" ); #> Hello! |
那么输出的结果就是
0,1,2,3,4
Hello!
凡是能在平时我们VS里面书写的代码,都可以在<# #>里表示。
4、表达式块(Expression Block)
表达式块以<#=Expression#>的形式表示,通过它之际上动态的解析的字符串表达内嵌到输出的文本中。
模板内容:
<#@ template language= "C#" #> <# for ( int i = 1; i <= 3; i++) { #> Hello World <#= i #>! <# } #> |
请注意这个:<#= i #>
后台编译的内容:
using System; using Microsoft.VisualStudio.TextTemplating; namespace Microsoft.VisualStudio.TextTemplating76E036EA7C70CB236 { public class GeneratedTextTransformation: TextTransformation { public override string TransformText() { for ( int i = 1; i <= 3; i++) { this .Write( "Hello World " ); this .Write(ToStringHelper.ToStringWithCulture(i)); this .Write( "!\r\n" ); } return this .GenerationEnvironment.ToString(); } } } |
输出的内容就是:
Hello World 1!
Hello World 2!
Hello World 3!
5、类特性块(Class Feature Block)
首先我们需要记住的是 类型性模块是有个+号的,比如<#+ #>这种类型的。
如果文本转化需要一些比较复杂的逻辑,我们需要写在一个单独的辅助方法中,甚至是定义一些单独的类,我们就是将它们定义在类特性块中。类特性块的表现形式为<#+ FeatureCode #>,对于Hello World模板,得到人名列表的InitializePersonList方法就定义在类特性块中。
其实说白了 就是在里面写方法,方便我们多次重用和调用,提高我们的开发效率。
比如:
<#@ template language= "C#" #> <# HelloWorld(); #> <# HelloWorld(); #> <#+ private void HelloWorld() { this .Write( "Hello World" ); } #> |
注意上面的+号的上面有个<# HelloWorld(); #> 。
所以,结果理所当然的就是有2个Hello World。
不过,您需要注意的是,你的这个类特性方法应该放到最后面去,比如你这样用:
<#@ template language= "C#" #> <# HelloWorld(); #> <# HelloWorld(); #> <#+ private void HelloWorld() { this .Write( "Hello World" ); } #> <# HelloWorld(); #> |
不好意思,它会给你报错,
ErrorGeneratingOutput
因为你不是放到最后面了,所以这里需要特别特别特别注意一下。
还有就是类特性的功能里面并 不仅仅只是一个方法,它里面还可以放很多东西,比如属性、常量、字段以及其他可以在其他编程里看到的C#结构都可以插入里面,我们足足可以见到它有多么强悍的生命力。
比如下面在举一个例子:
<#@ template language= "C#" #> <# HelloWorld(); #> <#+ private string _field = "classy" ; private void HelloWorld() { for ( int i = 1; i <= 3; i++) { #> Hello <#=_field#> World <#= i #>! <#+ } } #> |
输出的结果就是:
Hello classy World 1!
Hello classy World 2!
Hello classy World 3!
OK。T4语言的就简单的到这里。写的比较仓促,希望能得到谅解。有问题可以在讨论。谢谢。
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
[转]T4系列文章之3:T4语法的介绍的更多相关文章
- T4系列文章之1:认识T4
一.导读 MSDN:Code Generation and T4 Text Templates 博客园:编写T4模板进行代码生成 Oleg Sych系列文章:http://www.olegsych.c ...
- 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 上图 ...
- 微信JS图片上传与下载功能--微信JS系列文章(三)
概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...
- 微信JS分享功能--微信JS系列文章(二)
概述 在上一篇文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的分享功能进行描述,供大家参考. 代码 $(document).ready(f ...
- 《基于.NET Core构建微服务》系列文章(更新至第6篇,最新第7篇,已发布主页候选区)
原文:Building Microservices On .NET Core – Part 1 The Plan 时间:2019年1月14日 作者:Wojciech Suwała, Head Arch ...
- EF和MVC系列文章导航:EF Code First、DbContext、MVC
对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...
- 开篇:软件项目的整个流程 - IT软件人员学习系列文章
这段时间闲来无事,就在总结以前的项目经验,然后写成博客的形式以进行记录.本文就对<IT软件人员学习系列文章>做个开篇吧. 对于IT软件的开发来说,无外乎B/S.C/S和Android.iO ...
- IT软件人员的技术学习内容(写给技术迷茫中的你) - 项目管理系列文章
前面笔者曾经写过一篇关于IT从业者的职业道路文章(见笔者文:IT从业者的职业道路(从程序员到部门经理) - 项目管理系列文章).然后有读者提建议说写写技术方面的路线,所以就有了本文.本文从初学者到思想 ...
随机推荐
- UVa 12563_Jin Ge Jin Qu hao
[题意]在KTV唱歌,假设每首歌最长180s,时间结束时如果还有歌正在唱,则将此歌唱完.为使唱歌时间最长,规定最后唱长达678s的<劲歌金曲>[介是个嘛?] 假设你正在唱KTV,在剩余的t ...
- <项目><day11>查看用户浏览过的商品
<项目>查看用户浏览过的商品 1.创建一个entity包储存实体对象 1.1创建一个Product的类存储实体对象 对象具有以下属性,并添加set和get方法,含参和不含参的构造方法,to ...
- pycharm下运行和调试scrapy项目
1. 新建项目 默认在本地已经新建了一个scrapy爬虫项目 2. 打开项目 点击open à 选择刚刚那个本地的scrapy项目meijutt100 3. 项目结构 各个py文件的作用不作介绍,不懂 ...
- JAVA配置--JDK环境变量配置
环境变量是整台电脑的全局变量,(这台电脑上)任何程序都可以读取这个变量. 如果您安装好jdk,但环境变量配置让你感到有一点模糊的话,那么请您看一下这篇,希望对您有帮助 根据打开电脑的属性(R),出现 ...
- GDAL源码编译
转自阿Fai, GDAL源码编译 在这里,我使用源码编译出C#可以使用的dll静态文件. 一.简单的编译 1.简单的认识 首先进入GDAL的源代码目录,可以看到有几个sln为后缀的文件名,比如make ...
- 如何启动/关闭weblogic
听语音 | 浏览:7107 | 更新:2014-12-25 15:43 1 2 3 4 5 6 分步阅读 最近用到weblogic 给大家分享一下如何启动和关闭weblogic 工具/原料 电脑 ...
- SAS编程基础 - 菜鸟入门常用操作
1. SAS9.4添加和取消注释的快捷键? Ctrl+/:添加注释 Ctrl+Shift+/:取消注释 2. 如何强制终止程序运行? 看到那个圆圈里带叹号的图标了吗?没错,就是它 - 中断! 3. 如 ...
- 关于MacBook怎么更新Android SDK
昨天公司的人给了我一个VPN,可是还是无法更新SDK,后来发现将下图: 通过VPN发送全部流量勾选以后就能够连接更新了,哎.处处皆学问,特此分享一下此经验. 喜欢的朋友关注我哦! 多谢支持
- Android之应用程序怎样调用支付宝接口
http://blog.csdn.net/lilidejing/article/details/19483717 近期在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口.由于用的人比 ...
- IE6\7\8 :last-child 和 :first-chlid 兼容
IE9以下不支持last-child ,只支持first-child,边框尽量用上边框.