背景

官方教程: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. linux基础知识(四)

    •查看ip地址,ifconfig命令 •重启.启动.停止网络命令 •service network restart/start/stop   •VMnet0:用于虚拟桥接网络下的虚拟交换机 •VMne ...

  2. VC++ chap12 file

    file operation _______C语言对文件操作的支持 fopen accepts paths that are valid on the file system at the point ...

  3. Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...

  4. java 封装httpclient 的get 和post 请求

    import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import java.util. ...

  5. AndroidStudio调试APP

    AndroidStudio调试APP 电脑用数据线连上手机 开启手机的开发者模式 注:通常连续狂点手机的版本号即可显示出开发者选项,然后进入菜单,勾选开发者选项.USB调试. 给程序加断点 单击调试按 ...

  6. C_C++圣战(摘录)

    我的回忆和有趣的故事 --- C/C++圣战篇 李维 (声明以下的这篇文章内容是我个人的回忆以及看法,没有任何特别的偏见,许多的事情是根据我的记忆以及从许多人的诉说中得知的,也许内容不是百分之百的正确 ...

  7. Prim算法和Kruskal算法(图论中的最小生成树算法)

    最小生成树在一个图中可以有多个,但是如果一个图中边的权值互不相同的话,那么最小生成树只可能存在一个,用反证法很容易就证明出来了. 当然最小生成树也是一个图中包含所有节点的权值和最低的子图. 在一个图中 ...

  8. java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService

    前面已经指出通过实现Runnable时,Thread类的作用就是将run()方法包装成线程执行体,那么是否可以直接把任意方法都包装成线程执行体呢?Java目前不行,但其模仿者C#中是可以的. Call ...

  9. protocol buffers的使用示例[z]

    [http://blog.csdn.net/zhu_xun/article/details/19397081] protocol buffers的使用示例 如果不了解protocol buffers, ...

  10. Trie树:POJ2001

    这是一道最简单的trie树的题 有趣的是这道题的测试用例无法在VS上调试,只能在框框里不断提交测试了,哈哈 最基本的Trie树,插入和查找操作没什么好说的 注意节点添加一个count变量作为附加条件, ...