[转]T肆连串小说之3:T4语法的牵线

正文转自:http://www.cnblogs.com/damonlan/archive/2012/03/06/2382724.html

因为那段时日一贯都没空,笔者也不知晓有未有对人T肆感兴趣,但不论了,先记下在说啊,就当是笔者的笔记。

指望对你们有用。

如若你对T4还相比较目生,推荐您在复习几篇小说:

One:T四层层文章之1:认识T4

Two:T肆密密麻麻文章之贰:T四工具简单介绍、调节和测试以及T四运营原理

复习复习。。

T4语言的语法极粗略,能够说1学就会。它不像C#要么JAVA同样,那么多的界定什么的。所以,只要会C#语言,然后再上学一点T四它应当小心的地点,那么就OK了。

是否很心动了?心动不比走路吗。

T四模板的主干组织:
它们大多能够分成5类:指令块(Directive Block)、文本块(Text
Block)、代码语句块(Statement Block)、表明式块(Expression
Block)和类天性块(Class Feature Block)。

图片 1

您看下边包车型地铁截图,把部分为主的都位列出来了。

1、指令块(Directive Block)

先是,值要求牢记的是 指令块是已@起头的。 比如你见到的上面。

图片 2

和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”] #>

 它至关心重视要有1个乐趣:1个只的是写模板所利用的言语,比如<#@ template 
language=”C#” #> 那么笔者那么些模板能够用C#来些。

另叁个很重点的风味指的是:承继。就是把部分共用的措施抽象到父模板中,然后能够在七个模板中开始展览复用。那么些特别有用,笔者未来会日益的牵线。
比如:<#@ template language=”C#” inherits=”CommonTemplate”
debug=”true” #> CommonTemplate是自己写的一个公共模板。

6. <#@ include file=”” #>

其一很有趣,意思正是在此时此刻的模板中富含其它二个文书中的内容。先来贰个很简短的例证。

  六.一 新建1个空白的公文模板 ,命名叫:MyTextTemplate.tt

  陆.二 在新建二个 txt文件,里面写入一些字。myText.txt

  6.3 在MyTextTemplate.tt模板中,<#@ include
file=”myText.txt”#>

  陆.肆  然后您就足以在MyTextTemplate.tt看到 你文本中的1些字符。

    对第五点须求的注意事项:

  1. file的门路可以是相对路线、相对路线。

    2.file得以总结环境变量,但它必须用%包起来。比如<#@ include
file=”%HOMEPATH%\MyIncludeFile.t4″ #>

    3.file后头的文书的扩充名不可能包涵 .tt结尾的。

纵然您需求用.tt的结尾,你必要用四t来取代。那是因为只要您加了.tt后缀的公文名,因为vs会自动是把当前.tt的文件的Custom
Tool(自定义务工作具)属性设定为TextTemplatingFileGenerator。

2、文本块(Text Block)

文本块就是一贯原样输出的静态文本,不需求丰盛别的的标签。在上边的模板文件中,处理定义在<#…
#>、<#+… #>和<#=…
#>中的文本都属于文本块。比如在命令块甘休到第3个“<#”标签之间的剧情正是1段静态的文本块。

模板内容:

?

<#@ 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!

5、类性子块(Class Feature
Block)

首先大家需求牢记的是 类型性模块是有个+号的,比如<#+
#>那种类型的。  

如果文本转化供给部分相比复杂的逻辑,大家要求写在2个独门的救助方法中,甚至是概念1些独自的类,大家正是将它们定义在类天性块中。类特色块的表现形式为<#+
FeatureCode #>,对于Hello
World模板,得到人名列表的InitializePersonList方法就定义在类天性块中。

骨子里轻巧正是在中间写方法,方便大家反复收音和录音和调用,进步我们的开支作用。

比如:

?

<#@ template language="C#"#>
<# HelloWorld(); #>
<# HelloWorld(); #>
<#+
    private void HelloWorld()
    {
        this.Write("Hello World");
    }
#>

 注意下边包车型大巴+号的上边有个<# HelloWorld(); #> 。

之所以,结果自然的便是有1个Hello World。

然则,您要求留意的是,你的那几个类特性方法应该放权最前面去,比如您那样用:

?

<#@ template language="C#"#>
<# HelloWorld(); #>
<# HelloWorld(); #>
<#+
    private void HelloWorld()
    {
        this.Write("Hello World");
    }
#>
<# HelloWorld(); #>

  

不好意思,它会给你报错,

ErrorGeneratingOutput

因为你不是停放最前面了,所以那边要求特地特别尤其注意一下。

再有就是类特色的意义里面并
不仅仅只是3个主意,它个中还足以放许多东西,比如属性、常量、字段以及别的能够在任何编制程序里观察的C#协会都得以插入里面,大家起码能够看出它有多么强悍的生气。

譬如说下边在举3个例证:

?

<#@ 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语言的就总结的到那里。写的可比仓促,希望能获取原谅。有标题能够在座谈。多谢。

 

 

 

 

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

本博文欢迎我们浏览和转发,但未经笔者同意必须保留此段证明,且在小说页面显明地点给出原来的小说连接,在『参考』的稿子中,笔者会申明参考的稿子来源,尊重旁人版权。若您发现自个儿入侵了你的版权,请登时与本人关系。