zoukankan      html  css  js  c++  java
  • T4学习- 1、简介

    一、T4简介

          T4(Text Template Transformation Toolkit)在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。

    2012021410005097[1]

          T4 文本模板有两种类型:

    1、运行时模板

      可在应用程序中执行运行时 T4 文本模板(“预处理过的”模板)以便生成文本字符串(通常作为其输出的一部分)。

      若要创建运行时模板,请向您的项目中添加“已预处理的文本模板”文件。

      另外,您还可以添加纯文本文件并将其“自定义工具”属性设置为“TextTemplatingFilePreprocessor”。

    2、设计时模板

      在 Visual Studio 中执行设计时 T4 文本模板,以便定义应用程序的部分源代码和其他资源。

      通常,您可以使用读取单个输入文件或数据库中的数据的多个模板,并生成一些 .cs、.vb 或其他源文件。

      每个模板都生成一个文件。 在 Visual Studio 或 MSBuild 内执行它们。

      若要创建设计时模板,请向您的项目中添加“文本模板”文件。 另外,您还可以添加纯文本文件并将其“自定义工具”属性设置为“TextTemplatingFileGenerator”。

    二、T4例子--HelloWorld

           最简单的HelloWorld,通过此例子,可以看到T4的基本结构

    <#@ template debug="false" hostspecific="false" language="C#" #>
    <#@ output extension=".cs" #>
    <#@ import namespace="System" #>
    <#@ import namespace="System.Collections.Generic" #>
    
    using System;
    
    namespace Test
    {
        public class HelloWorld
        { 
            public static void Main(string[] args)
            {
                <# 
                List<Person> people = GetPersonList();
                foreach(Person p in people)
                {
                #>
                Console.WriteLine("Hello {0},Welcome to T4 World!","<#= p.Name #>");
                <#}
                #>
            }
        }
    }
    
    <#+
    //
    public class Person
    {
        ///名称
        public string Name{ get; set; }
    
        public Person(string name)
        {
            this.Name = name;
        }
    }
    //初始化众人
    public List<Person> GetPersonList()
    {
        List<Person> people = new List<Person>();
    
        Person p1 = new Person("Tom");
        Person p2 = new Person("Jim");
        Person p3 = new Person("Lucy");
    
        people.Add(p1);
        people.Add(p2);
        people.Add(p3);
    
        return people;
    }
    
    #>
    生成的代码:
    using System;
    
    namespace Test
    {
        public class HelloWorld
        {
            public static void Main(string[] args)
            {
                Console.WriteLine("Hello {0},Welcome to T4 World!", "Tom");
                Console.WriteLine("Hello {0},Welcome to T4 World!", "Jim");
                Console.WriteLine("Hello {0},Welcome to T4 World!", "Lucy");
            }
        }
    }

    三、T4模板的基本结构

          代码块的总体分类,就是两种:文本、程序脚本

    • 文本:就是需要生成的文本
    • 程序脚本:内部执行,最终生成想要的文本。T4中<# #>中的部分都属于程序脚本内容。

    为了细分语法,方便大家更好的理解,用“块”(Block)来表示构成T4模板的基本单元,它们基本上可以分成5类:指令块(Directive Block)、文本块(Text Block)、代码语句块(Statement Block)、表达式块(Expression Block)和类特性块(Class Feature Block)。

    1、指令块(Directive Block)

          和ASP.NET页面的指令一样,它们出现在文件头,通过<#@…#>表示。其中<#@ template …#>指令是必须的,用于定义模板的基本属性,比如编程语言、基于的文化、是否支持调式等等。比较常用的指令还包括用于程序集引用的<#@ assembly…#>,用于导入命名空间的<#@ import…#>等等。

          指令通常是模板文件或包含的文件中的第一个元素。不应将它们放置在代码块 <#...#> 内,也不应放置在类功能块 <#+...#> 之后。

    • T4 模板指令
      <#@ template [language="VB"] [hostspecific="true"] [debug="true"] [inherits="templateBaseClass"] [culture="code"] [compilerOptions="options"] #>
    • T4 参数指令
      <#@ parameter type="Full.TypeName"name="ParameterName"#>
    • T4 输出指令
      <#@ output extension=".fileNameExtension"[encoding="encoding"] #>
    • T4 程序集指令
      <#@ assembly name="[assembly strong name|assembly file name]"#>
    • T4 导入指令
      <#@ import namespace="namespace"#>
    • T4 包含指令
      <#@ include file="filePath"#>

    2、文本块(Text Block)

          文本块就是直接原样输出的静态文本,不需要添加任何的标签。

    3、代码语句块(Statement Block)

          代码语句块通过<#Statement#>的形式表示,中间是一段通过相应编程语言编写的程序调用,我们可以通过代码语句快控制文本转化的流程。在上面的代码中,我们通过代码语句块实现对一个数组进行遍历,输出重复的Console.WriteLine("Hello {0},Welcome to T4 World!","<#= p.Name #>");语句。

    4、表达式块(Expression Block)

          表达式块以<#=Expression#>的形式表示,通过它之动态的解析的字符串表达内嵌到输出的文本中。比如在上面的foreach循环中,每次迭代输出的人名就是通过表达式块的形式定义的(<#=  p.Name #>)

    5、类特性块(Class Feature Block)

          如果文本转化需要一些比较复杂的逻辑,我们需要写在一个单独的辅助方法中,甚至是定义一些单独的类,我们就是将它们定义在类特性块中。类特性块的表现形式为<#+ FeatureCode #>对于Hello World模板,得到人名列表的GetPersonList方法就定义在类特性块中。

    <#@ template language="C#" #>
    <# HelloWorld(); #>
    <#+
        private string _field = "classy";
        private void HelloWorld()
        {
            for(int i = 1; i <= 3; i++)
            {
    #>
               Hello <#=_field#> World <#= i #>!
    <#+
            }
        }
    #>

    四、T4模板语言编辑工具:

    下载地址:tangible T4 Editor plus modelling tools

    http://t4-editor.tangible-engineering.com/Download_T4Editor_Plus_ModelingTools.html

    只需要简单的填一下,就OK了,是免费的哦。

    主要的功能:

    1. 语法高亮显示
    2. T4中的指示符(directives)和代码快(code block)智能提示
    3. 对模板代码的智能提示
    4. 支持T4包含文件

    image

    五.T4的工作原理

    我在网上找了一张很好图,如下

    2012011212202287[1]

    在这个第一步的时候,T4引擎编译这个模板文件:它会解析指令处理文件(也就是@开头部分)、文本文件和代码块,然后生成一个具体的TextTransformation 文件,接着会把这个类文件编译成.NET的程序集。

    第二步的时候,T4引擎会创建一个GeneratedTextTransformation 类的实例,它的名字叫做:TransformText的方法,这个方法的主要作用就是用来保存输出文件中放回的字符串。

    模板内容:

    <#@ 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("!
    ");
             }
             return this.GenerationEnvironment.ToString();
           }
       }
    }
      输出的内容就是:
    Hello World 1!
    Hello World 2!
    Hello World 3!

    自定义宿主:
    https://msdn.microsoft.com/zh-cn/library/bb126579.aspx
  • 相关阅读:
    6.1 tar:打包备份
    6.3-4 zip、unzip
    6.5 scp:远程文件复制
    S7 Linux用户管理及用户信息查询命令
    7.6 passwd:修改用户密码
    7.2-5 usermod
    DES
    FreeRTOS笔记
    第4章 裸机系统和多任务系统
    第008课_第1个ARM落版程序及引申
  • 原文地址:https://www.cnblogs.com/springsnow/p/10362484.html
Copyright © 2011-2022 走看看