C语言[转]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)。

C语言 1

而看上面的截图,把一部分核心的还摆出了。

1、指令块(Directive Block)

首先,值需要记住的是 指令块是曾经@开头的。 比如你看来的底。

C语言 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”] #>

 它根本发生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看到 你文本中之片字符。

    本着第六沾要之注意事项:

  1. 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语言的即简单的到这边。写的较仓促,希望会博得原谅。有题目可于讨论。谢谢。

 

 

 

 

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

本博文欢迎大家浏览和转载,但未经作者同意要保留这个段子声明,且以篇章页面明显位置被起原文连接,在『参考』的文章被,我会表明参考的章来源,尊重别人版权。若你发现自侵犯了您的版权,请立刻和自己联系。