zoukankan      html  css  js  c++  java
  • T4:T4 笔记 + Trait 示例

    背景

    官方教程:http://msdn.microsoft.com/en-us/library/vstudio/bb126445.aspx

    如果开发环境或编译器内置了对模板的支持而没有善加利用,就算是一只浪费了。简单的使用模板就是代码生成器,也可以更细致的使用模板,比如模拟Trait。

    Trait示例

    Dog

    1 namespace T4Study.Trait
    2 {
    3     public partial class Dog
    4     {
    5         public string Name { get; set; }
    6     }
    7 }

    Man

    1 namespace T4Study.Trait
    2 {
    3     public partial class Man
    4     {
    5         public string Name { get; set; }
    6     }
    7 }

    Trait

     1 <#@ template debug="false" hostspecific="false" language="C#" #>
     2 <#@ assembly name="System.Core" #>
     3 <#@ import namespace="System.Linq" #>
     4 <#@ import namespace="System.Text" #>
     5 <#@ import namespace="System.Collections.Generic" #>
     6 <#@ output extension=".cs" #>
     7 
     8 <# Trait(() => { #>
     9         public void Play()
    10         {
    11             System.Console.WriteLine(this.Name + ",游戏中!");
    12         }
    13 <# }, "T4Study.Trait.Dog", "T4Study.Trait.Man"); #>
    14 
    15 <#@include file="../Includes/Trait.txt" #>

    测试

    1         static void Main(string[] args)
    2         {
    3             var man = new Trait.Man { Name = "段光伟" };
    4             var dog = new Trait.Dog { Name = "旺仔" };
    5 
    6             man.Play();
    7             dog.Play();
    8         }

    总结

    本例中,接口 + 扩展类型 可以做到同样的效果,T4 + 部分类 为我们提供了另外一种选择。

    设计时代码生成

    官方教程:http://msdn.microsoft.com/en-us/library/vstudio/dd820620.aspx

    使用相对路径(相对于模板)获取文件或目录的路径

    hostspecific 设置为 true

    1 <#@ template debug="false" hostspecific="true" language="C#" #>

    使用 this.Host.ResolvePath(相对路径)

    1 <#= this.Host.ResolvePath("Class.Data.txt") #>

    获取当前模板的路径

    hostspecific 设置为 true,使用 this.Host.TemplateFile

    1 <#= this.Host.TemplateFile #>

    访问开发环境

    hostspecific 设置为 true,引用 EnvDTE

    1 <#@ assembly name="EnvDTE" #>

    获取 EnvDTE.DTE 实例

    1 <#
    2     IServiceProvider serviceProvider = (IServiceProvider)this.Host;
    3     EnvDTE.DTE dte = (EnvDTE.DTE) serviceProvider.GetService(typeof(EnvDTE.DTE));
    4 #>
    5 
    6  项目总数:<#= dte.Solution.Projects.Count #>

    向VS报告错误

    1 this.Error("错误信息");
    2 this.Warning("警告信息");

    定义帮助方法

    1 <#+
    2  private string UpperInitial(string name)
    3  { 
    4     return name[0].ToString().ToUpperInvariant() + name.Substring(1); 
    5  }
    6 #>

    复用模板片段

    1 <#@include file="../Includes/Header.txt" #>

    复用的片段里可以有任何模板里可以包含的内容,复用的片段里还可以再包含其它复用的片段。

    运行时代码生成

    官方教程:http://msdn.microsoft.com/en-us/library/vstudio/ee844259.aspx

    引用程序集

    在VS中添加对程序集的引用即可,这里和设计时代码生成不一样(使用 <#@ assembly name="System.Core" #>)。

    定义帮助方法

    1 <#+
    2  private string UpperInitial(string name)
    3  { 
    4     return name[0].ToString().ToUpperInvariant() + name.Substring(1); 
    5  }
    6 #>

    和设计时代码生成不同的是,在部分类里可以定义任何类型成员。

    复用模板片段

    1 <#@include file="../Includes/Header.txt" #>

    复用的片段里可以有任何模板里可以包含的内容,复用的片段里还可以再包含其它复用的片段。

    继承父模板

    使用 inherits 继承父模板

    <#@ template language="C#" inherits="BaeTemplate" #>

    模板惯用法

    官方教程:http://msdn.microsoft.com/en-us/library/vstudio/bb126478.aspx

    惯用法:

    1. 使用<#@include #>指令 + <#+ #> 进行复用。
      It is particularly useful to place a method that generates text in a separate file that can be included by more than one template.
    2. 在<#@ assembly #>中可以使用宏名称:<#@ assembly name="$(SolutionDir)libraryMyAssembly.dll" #>。
    3. 转义<##>:<# ... #>。

    备注

    官方永远是最好的教程,本文只记录了一些关键点,主要为了方便快速查阅。

  • 相关阅读:
    (转载)C++ string中find() ,rfind() 等函数 用法总结及示例
    UVA 230 Borrowers (STL 行读入的处理 重载小于号)
    UVA 12100 打印队列(STL deque)
    uva 12096 The SetStack Computer(STL set的各种库函数 交集 并集 插入迭代器)
    uva 1592 Database (STL)
    HDU 1087 Super Jumping! Jumping! Jumping!
    hdu 1176 免费馅饼
    HDU 1003 Max Sum
    转战HDU
    hust 1227 Join Together
  • 原文地址:https://www.cnblogs.com/happyframework/p/3339138.html
Copyright © 2011-2022 走看看