背景

官方教程: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. Corba、protocol buffer、SOA的区别 (转)

    From: http://www.zhihu.com/question/20279489 Google的protocol buffers?这个跟corba.soa没啥关系,不同层次的概念,没法比.pr ...

  2. redis基础使用

    redis分linux,window两个版本分支. redis在window下的使用先下载相关包.下载地址:https://github.com/MSOpenTech/redis/releases 下 ...

  3. sublime text3 输入中文的解决方法及注册

    让它输入中文的原理就是给sublime text3给打上个补丁libsublime-imfix.so,这个补丁可以直接git回来,或者下载补丁的源码编译安装. Ubuntu可以直接按照下面的教程 su ...

  4. .net中自定义过滤器对Response内容进行处理

    原文:http://www.cnblogs.com/zgqys1980/archive/2008/09/02/1281895.html 代码DEMO:http://files.cnblogs.com/ ...

  5. Nginx配置文件(nginx.conf)配置详解

    Nginx的配置文件nginx.conf配置详解如下: user nginx nginx ; Nginx用户及组:用户 组.window下不指定 worker_processes 8; 工作进程:数目 ...

  6. php 乱码解决

    1)首先确定你的终端编码,如果你不知道如何确定,分别执行这两段代码,看看哪个能输出中文. PHP code   ? 1 echo pack("H12","E4B8ADE6 ...

  7. win 7安装 linux

    http://blog.csdn.net/wuwenxiang91322/article/details/23528619

  8. PostgreSQL用户角色及其属性介绍

    1.CREATE ROLE创建的用户默认不带LOGIN属性,而CREATE USER创建的用户默认带有LOGIN属性,如下: postgres=# CREATE ROLE pg_test_user_1 ...

  9. 完成了第一个java

    这是我的第一个java程序,求水仙花数2016-04-26  22:39:09

  10. WPF 设置透明度和圆形图片

    1 设置效果为