T4:T4 笔记 + Trait 示例
背景
官方教程: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。
惯用法:
- 使用<#@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. - 在<#@ assembly #>中可以使用宏名称:<#@ assembly name="$(SolutionDir)library\MyAssembly.dll" #>。
- 转义<##>:\<# ... \#>。
备注
官方永远是最好的教程,本文只记录了一些关键点,主要为了方便快速查阅。
T4:T4 笔记 + Trait 示例的更多相关文章
- 【原创】SpringBoot & SpringCloud 快速入门学习笔记(完整示例)
[原创]SpringBoot & SpringCloud 快速入门学习笔记(完整示例) 1月前在系统的学习SpringBoot和SpringCloud,同时整理了快速入门示例,方便能针对每个知 ...
- Scrapy笔记02- 完整示例
Scrapy笔记02- 完整示例 这篇文章我们通过一个比较完整的例子来教你使用Scrapy,我选择爬取虎嗅网首页的新闻列表. 这里我们将完成如下几个步骤: 创建一个新的Scrapy工程 定义你所需要要 ...
- 【工作笔记】BAT批处理学习笔记与示例
BAT批处理学习笔记 一.批注里定义:批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD,这些命令统称批处理命令. 二.常见的批处理指令: 命令清单: 1.RE ...
- python采用pika库使用rabbitmq总结,多篇笔记和示例
这一段时间学习了下rabbitmq,在学习的过程中,发现国内关于python采用pika库使用rabbitmq的资料很少,官网有这方面的资料,不过是都英文的.于是笔者结合自己的理解,就这方面内容写了一 ...
- python采用pika库使用rabbitmq总结,多篇笔记和示例(转)
add by zhj:作者的几篇文章参考了Rabbitmq的Tutorials中的几篇文章. 原文:http://www.01happy.com/python-pika-rabbitmq-summar ...
- Spring Cloud 微服务架构学习笔记与示例
本文示例基于Spring Boot 1.5.x实现,如对Spring Boot不熟悉,可以先学习我的这一篇:<Spring Boot 1.5.x 基础学习示例>.关于微服务基本概念不了解的 ...
- java新手笔记6 示例for
1.计算天数 /*给定一个年月日,计算是一年的第几天 (如输入:2 15 结果:第46天) */ public class Demo1 { public static void main(String ...
- EntityFrameworkCore 学习笔记之示例一
直接贴代码了: 1. Program.cs using Microsoft.EntityFrameworkCore; using System; using System.Threading.Task ...
- 用T4 Template生成代码
1 T4语法 T4的语法与ASP.NET的方式比较类似.主要包括指令.文本块.控制块. 1.1 指令 指令主要包括template, output, assembly, import, incl ...
随机推荐
- pt-query-digest查询日志分析工具
1.工具介绍 pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog.General log.slowlog,也可以通过SHOWPROCESSLIST或者通过tcp ...
- format when printing
http://msdn.microsoft.com/en-us/library/vstudio/56e442dc.aspx %[flags] [width] [.precision] [{h | l ...
- Apache错误:[error] (OS 10038)在一个非套接字上尝试了一个操作
Apache错误:[error] (OS 10038)在一个非套接字上尝试了一个操作 博客分类: vb2005xu软件学习 OSApache防火墙PHPWindows 日志如下:[ ...
- VC++模态对话框和非模态对话框
MFC中有两种类型的对话框:模态对话框和非模态对话框. 模态对话框是指当其显示时,程序会暂停执行,直到关闭这个模态对话框后,才能继续执行程序中其他任务.非模态对话框是指当其显示时,允许转而执行程序中 ...
- Python-dict与set
dict(字典):用空间换取时间,占据空间大,但查询速度快,键值对(key:value),key唯一 d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} 由于一个k ...
- lucene prefixQuery
prefixQuery是lucene的一个前缀匹配的搜索功能,但是它的前缀匹配不是完全的前缀匹配,的query生成是:易* 但是能把所有带有易字的都搜到... 下面是实验:出现了交易...
- push
1:收到通知的那一刻,app的状态可能是未启动,前台以及后台 如果未启动,等待点击app的时候进行界面跳转的时候接收到通知(didFinishLaunchngWithOPtions) 如果是前台以及后 ...
- 运行时报错-Verify the Developer App certificate for youraccount is trusted on your device. Open Settings on Mayoyi_sakura and navigate to General -> Device Management, then select your
解决方法:打开手机设置->通用->设备管理,找到编辑工程时的ID资料,点击允许即可.
- OneNote的配置
-------siwuxie095 1.点击 "文件" 2.点击 "发送"->"发送至博客" 3.配置博客园的连接 (1)选择博客提供 ...
- MySQL表分区
MySQL的表分区 一.什么是表分区通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了.如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以 ...