背景

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

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

Trait示例

Dog

 namespace T4Study.Trait
{
public partial class Dog
{
public string Name { get; set; }
}
}

Man

 namespace T4Study.Trait
{
public partial class Man
{
public string Name { get; set; }
}
}

Trait

 <#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #> <# Trait(() => { #>
public void Play()
{
System.Console.WriteLine(this.Name + ",游戏中!");
}
<# }, "T4Study.Trait.Dog", "T4Study.Trait.Man"); #> <#@include file="../Includes/Trait.txt" #>

测试

         static void Main(string[] args)
{
var man = new Trait.Man { Name = "段光伟" };
var dog = new Trait.Dog { Name = "旺仔" }; man.Play();
dog.Play();
}

总结

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

设计时代码生成

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

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

hostspecific 设置为 true

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

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

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

获取当前模板的路径

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

 <#= this.Host.TemplateFile #>

访问开发环境

hostspecific 设置为 true,引用 EnvDTE

 <#@ assembly name="EnvDTE" #>

获取 EnvDTE.DTE 实例

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

向VS报告错误

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

定义帮助方法

 <#+
private string UpperInitial(string name)
{
return name[].ToString().ToUpperInvariant() + name.Substring();
}
#>

复用模板片段

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

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

运行时代码生成

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

引用程序集

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

定义帮助方法

 <#+
private string UpperInitial(string name)
{
return name[].ToString().ToUpperInvariant() + name.Substring();
}
#>

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

复用模板片段

 <#@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)library\MyAssembly.dll" #>。
  3. 转义<##>:\<# ... \#>。

备注

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

T4:T4 笔记 + Trait 示例的更多相关文章

  1. 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)

    [原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...

  2. Scrapy笔记02- 完整示例

    Scrapy笔记02- 完整示例 这篇文章我们通过一个比较完整的例子来教你使用Scrapy,我选择爬取虎嗅网首页的新闻列表. 这里我们将完成如下几个步骤: 创建一个新的Scrapy工程 定义你所需要要 ...

  3. 【工作笔记】BAT批处理学习笔记与示例

    BAT批处理学习笔记 一.批注里定义:批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD,这些命令统称批处理命令. 二.常见的批处理指令: 命令清单: 1.RE ...

  4. python采用pika库使用rabbitmq总结,多篇笔记和示例

    这一段时间学习了下rabbitmq,在学习的过程中,发现国内关于python采用pika库使用rabbitmq的资料很少,官网有这方面的资料,不过是都英文的.于是笔者结合自己的理解,就这方面内容写了一 ...

  5. python采用pika库使用rabbitmq总结,多篇笔记和示例(转)

    add by zhj:作者的几篇文章参考了Rabbitmq的Tutorials中的几篇文章. 原文:http://www.01happy.com/python-pika-rabbitmq-summar ...

  6. Spring Cloud 微服务架构学习笔记与示例

    本文示例基于Spring Boot 1.5.x实现,如对Spring Boot不熟悉,可以先学习我的这一篇:<Spring Boot 1.5.x 基础学习示例>.关于微服务基本概念不了解的 ...

  7. java新手笔记6 示例for

    1.计算天数 /*给定一个年月日,计算是一年的第几天 (如输入:2 15 结果:第46天) */ public class Demo1 { public static void main(String ...

  8. EntityFrameworkCore 学习笔记之示例一

    直接贴代码了: 1. Program.cs using Microsoft.EntityFrameworkCore; using System; using System.Threading.Task ...

  9. 用T4 Template生成代码

    1 T4语法 T4的语法与ASP.NET的方式比较类似.主要包括指令.文本块.控制块. 1.1    指令 指令主要包括template, output, assembly, import, incl ...

随机推荐

  1. dll 导出函数名的那些事

    dll 导出函数名的那些事 关键字: VC++  DLL  导出函数 经常使用VC6的Dependency或者是Depends工具查看DLL导出函数的名字,会发现有DLL导出函数的名字有时大不相同,导 ...

  2. Oracle 查询类似 select top 的用法

    --查询前10条数据select * from MID_EHR_STAFF where rownum<10;--查询第5~10条的记录,minus(减)select * from MID_EHR ...

  3. 4.0以后的新布局方式GridLayout

    <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android=" ...

  4. 为什么匿名内部类和局部内部类只能访问final变量

    因为虽然匿名内部类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处的位置和外部类中的方法处在同一个等级上,外部类中的方法中的变量或参数只是方法的局部变量,这些变量或 ...

  5. tdd 和 make file,以及cygwin

    等我把这本书看完,好好总结一下. 还要把以前的博客文字整理一下

  6. mysql处理海量数据时的一些优化查询速度方法

      最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法. 由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果w ...

  7. css加阴影

    box-shadow: 1px 1px 3px 1px rgba(0,0,0,0.1); -webkit-box-shadow: 1px 1px 3px 1px rgba(0,0,0,0.1); -m ...

  8. 单片机TM4C123学习(八):SPI接口D/A

    1.头文件和变量定义(不是很清楚) #include "driverlib/ssi.h" #include "driverlib/i2c.h" #include ...

  9. XML的Pull解析

    //通过xml解析串    private void XMLtoStr(String result) {        News news=null;        try {             ...

  10. Sql Server 孤立用户解决办法

    Sql Server 孤立用户 是我们经常遇到的事情,今天详细的梳理了下,希望能帮到你 当把用户数据库从一台 Sql Server 使用备份和恢复的方式迁移到另一台服务器.数据库恢复以后,原先用户定义 ...