T4模板_T4基本结构

T4文本模板由 指令块、文本块、控制块 组成。

一. 指令块(MSDN文本模板指令

    指令块以@开头,基本的指令块包括<#@ template #> 、<#@ parameter# >、
<#@ assembly>、<#@ import #> 、<#@ include#>、<#@ output#>
其中<#@ template #>是必须的,定义了该模板的基本属性

1.模板指令:

<#@ template [language="VB"] [compilerOptions="options"] [culture="code"] [debug="true"]            [hostspecific="true"] [inherits="templateBaseClass"] [visibility="internal"] [linePragmas="false"] #>

      模板指令所有特性都是可选的。
      compilerOptions特性:对运行时模板忽略。
  culture特性指定将表达式转换为文本时要使用的区域性。表示为xx-XX形式,有效值有en-US、ja-JP、de-CH、de-DE
  debug特性 是否启用调试
  inherits特性可以指定模板的程序代码可以继承自另一个类,这个类也可以是模板生成的。如果不指定inherits则会从您的文本模板生成基类和派生类。
  visibility 可见性特性,有效值 public(默认)、internal

2.参数指令

<#@ parameter type="Full.TypeName" name="ParameterName" #>

3.输出指令

<#@ output extension=".fileNameExtension" [encoding="encoding"] #>

     extension特性 指定生成的文本输出文件的文件扩展名,可接受任何有效的文件扩展名。默认值.cs

  encoding特性指定生成输出文件时要使用的编码,比如encoding="utf-8"  

4.程序集指令

<#@ assembly name="[assembly strong name|assembly file name]" #>

    在预处理文本模板中,assembly特性无效,改为在VS的"引用"中添加。如果程序集已经在GAC里面注册,那么只需要写上程序集名称即可,如<#@ assembly name="System.Data.dll" #>,否则需要指定程序集的物理路径

5.导入指令

<#@ import namespace="namespace" #>

  默认情况下会导入System命名空间的引用。

6.包含指令

<#@ include file="filePath" [once="true"] #>

      file可以使绝对的或相对当前模板文件。file可以包括用“%”分割的环境变量,如<#@ include file="%HOMEPATH%\MyIncludeFile.t4" #>包含指令可以提高代码的复用率,比如可以将一些常用的程序集、命名空间引用放到一个文件里,使用时仅需要应用即可,如,建立Reference.ttinclude文件,里面包含了我们平时常用的程序集引用,使用时只需要使用包含指令引用即可:

<#@ include file="$(ProjectDir)Reference.ttinclude" #>

二 .文本块(MSDN文本块

      文本块直接向输出文件插入文本。文本块没有特殊格式,例如,下面的文本模板将生成一个包含“Hello”的文本文件 

<#@ output extension=".txt" #>
Hello
 

三 .控制块(MSDN控制块

     控制块是用于转换模板的程序代码节。 默认语言是 C#,但若要使用 Visual Basic,可以在文件开头编写以下指令:
<#@ template language="VB" #>

    注:用于编写的控制块代码的语言与生成的文本语言无关。

 3.1标准控制块

   在模板文件中可以混合使用任意数量的文本块和标准控制块。但是不能再控制块中嵌套控制块。每个标准控制块都以<# #>符号分隔。例如:使用下面的空子块和文本块,输出结果“0,1,2,3,4 Hello!”:

<#
    for(int i = 0; i < 4; i++)
    {
        Write(i + ", ");
    }
    Write("4");
#> Hello!

还可以交错文本和代码,而不必使用显示Write()语句,以下输出“Hello!”4次:

<#
      for(int i=0;i<4;i++)
     { 
#>
       Hello!       
    
 <# } #>        

3.2 表达式控制块

      表达式控制块计算表达式并将其转换为字符串,输入到文件中。  表达式控制块以<#=... #>符号分隔。以下输出文件包含“5”:

<#=2+3 #>

 注意:开始符号有3个“<#=”。 表达式可以包含作用域的任何变量,如:

<#@ output extension=".txt" #>
<#
       for(int i=0;i<4;i++)
     {
   #>
   this is hello number  <#=i+1 #>: Hello!
<# 
      }
#>

3.3 类功能控制块

  类功能控制块定义 属性、方法或不应包含在主转换中的所有其他代码。类功能块常用于编写帮助器函数。通常,类功能块位于单独的文件中,这样他们可以包含在多个文本模板中。

类功能控制块以<#+...#>符号分隔。例如以下模板文件声明并使用一个方法:

<#@ output extension=".txt" #>
Squares:
<#
    for(int i=0;i<4;i++)
   {
#>
    The squares of <#=i #> is <#= Square(i+1) #>.
<#
     }
#>  
That is the end of list.
<#+  //Start of class feature block
   private int Square(int i)
{
   return i*i;
} 
#> 

     类功能块必须编写在文档末尾

      类功能块可以包含文本块

List of Squares:
<# 
    for(int i=0;i<4;i++)
    {  WriteSquareLine(i); }
#>
       End of List.
<#+   //class feature Block
      private void WriteSquareLine(int i)
      { 
#>
       the Square of <#= i #> is <#= i*i #>.
<#    
      }
#>        

 

 

posted @ 2014-05-07 15:08  互联网荒漠  阅读(676)  评论(0编辑  收藏  举报