码迷,mamicode.com
首页 > 其他好文 > 详细

T4模板试水篇2_T4基本结构

时间:2014-05-08 14:00:57      阅读:268      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   tar   

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!”:

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

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

bubuko.com,布布扣
<#
      for(int i=0;i<4;i++)
     { 
#>
       Hello!       
    
 <# } #>        
bubuko.com,布布扣

    3.2 表达式控制块

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

<#=2+3 #>

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

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

     3.3 类功能控制块

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

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

bubuko.com,布布扣
<#@ 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;
} 
#> 
bubuko.com,布布扣

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

      类功能块可以包含文本块

bubuko.com,布布扣
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 #>.
<#    
      }
#>        
bubuko.com,布布扣

 

 

T4模板试水篇2_T4基本结构,布布扣,bubuko.com

T4模板试水篇2_T4基本结构

标签:style   blog   class   code   java   tar   

原文地址:http://www.cnblogs.com/ashleyboy/p/3713848.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!