本文转自:http://www.cnblogs.com/damonlan/archive/2012/03/06/2382724.htmlhtml
由于这段时间一直都没空,我也不知道有没有对人T4感兴趣,但无论了,先记下在说吧,就当是个人笔记。编程
但愿对大家有用。编程语言
若是你对T4还比较陌生,推荐你在复习几篇文章:ide
One:T4系列文章之1:认识T4工具
Two:T4系列文章之2:T4工具简介、调试以及T4运行原理 post
复习复习。。学习
T4语言的语法很简单,能够说一学就会。它不像C#或者JAVA同样,那么多的限制什么的。因此,只要会C#语言,而后再学习一点T4它应该注意的地方,那么就OK了。this
是否是很心动了?心动不如行动吧。spa
T4模板的基本结构: 它们基本上能够分红5类:指令块(Directive Block)、文本块(Text Block)、代码语句块(Statement Block)、表达式块(Expression Block)和类特性块(Class Feature Block)。debug
你看上面的截图,把一些基本的都罗列出来了。
一、指令块(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看到 你文本中的一些字符。
对第六点须要的注意事项:
2.file能够包括环境变量,但它必须用%包起来。好比<#@ include file="%HOMEPATH%\MyIncludeFile.t4" #>
3.file后面的文件的扩展名不能包括 .tt结尾的。
若是你须要用.tt的结尾,你须要用4t来代替。这是由于若是你加了.tt后缀的文件名,由于vs会自动是把当前.tt的文件的Custom Tool(自定义工具)属性设定为TextTemplatingFileGenerator。
二、文本块(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!
三、代码语句块(Statement Block)
代码语句块经过<#Statement#>的形式表示,中间是一段经过相应编程语言编写的程序调用,咱们能够经过代码语句快控制文本转化的流程。
其实在咱们的使用中,对语句块的做用主要就是写C#代码。
好比,请看下面:
<#
for
(
int
i = 0; i < 4; i++)
{
Write(i +
", "
);
}
Write(
"4"
);
#> Hello!
|
那么输出的结果就是
0,1,2,3,4
Hello!
凡是能在平时咱们VS里面书写的代码,均可以在<# #>里表示。
四、表达式块(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!
五、类特性块(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语言的就简单的到这里。写的比较仓促,但愿能获得谅解。有问题能够在讨论。谢谢。
本博文欢迎你们浏览和转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,在『参考』的文章中,我会代表参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。