- 介绍
- 简单说下什么是t4模版
- 具体使用方式
- TransformText方法
- 自定义T4模板引擎
- 两种方式的比较
- 总结
最近工作中需要按一定的模板模型生成指定的文件,虽然可以直接拼接字符串来完成(动软代码生成器就是这么干的),但是我还是觉得使用一个模板引擎比较好,对于以后的扩展也比较友好。对于.net的程序员来说,其自带的T4模板就可以完成这个任务,但是由于长时间没有使用了,所以稍微花了点时间研究了下,并总结了两种方式,所以就有了这篇文章,也方便以后方便的时候查阅。
简单说下什么是t4模版T4
,即4个T开头的英文字母组合:Text Template Transformation Toolkit
。
T4(Text Template Transformation Toolkit
)是微软官方在VisualStudio 2008
中开始使用的代码生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本块和控制逻辑组成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制逻辑编写为程序代码的片段。生成的文件可以是任何类型的文本,例如网页、资源文件或任何语言的程序源代码。现在的VS中只要与代码生成相关的场景基本上都能找T4的身影,比如MVC的视图模板,Entity Framwork
的DataContext
模板等等。
可以所T4模版课快速帮你生产实体类或者需要重复编写但是格式一致的代码。
具体使用方式网上关于T4模板的文章也是有的,但是总体感觉比较杂,没有对其进行总结的文章。这里整理了两种生成方式,一种是通过自动生成的TransformText方法来完成最终文件的生成,另一个是通过自定义T4模板来完成最终文件的生成,之前我做个一个代码生成器,就是通过自定义的方式来完成的。
TransformText方法关于这种方式的案例,我打算借用网上的MultiArticle案例进行说明。
1、创建一个Console项目。
2、添加一个MultiArticle
类和同名的.tt
模板文件。
3、MultiArticle
类的的内容如下。
public class Article
{
public string Title { get; set; }
public string Content { get; set; }
}
public partial class MultiArticle
{
public string Subject { get; set; }
public List ArticleList { get; set; }
public MultiArticle(string subject, List articles) { Subject = subject; ArticleList = articles; }
}
这里需要特别注意的是,类一定要定义为 部分类,这个非常重要。否则最终将不能调用TransformText
方法。
4、MultiArticle.tt
的内容如下。
这里需要注意的是,模板的名称一定要和类的名称一样。另外就是模板名称右击==》属性后,【自定义工具】中的内容需要改为TextTemplatingFilePreprocessor
;【生成操作】改为无
;【复制到输出目录】是不复制
。
完成上面的内容后,可以在模板下看到生成的MultiArticle
类,这个是自动生成的,切记不可随便改动。
5、类Program
中的Main
方法如下。
string subject = "最新消息";
var artList = new List();
for (int i = 0; i < 4; i++)
{
Article art = new Article();
art.Title = "标题" + i + ":" + Guid.NewGuid();
art.Content = "内容" + i + ":" + Guid.NewGuid();
artList.Add(art);
}
MultiArticle mod = new MultiArticle(subject, artList);
//TransformText方法是模板编译时自动产生的,
//这也是前面有提到的,模板MultiArticle.tt的命名要与MultiArticleCode.cs中的类名相同的因,
//利用分部类partial,就可以调用该TransformText方法了。
String pageContent = mod.TransformText();
//将pageContent保存到任何你想保存的地方
System.IO.File.WriteAllText("outputPage.html", pageContent, Encoding.UTF8);
6、运行结果如下(outputPage.html文件的内容)。
关于此方式,一般建议单独建立一个类库作为模板引擎使用。所以我们会建立一个单独的类库,在建立一个控制台项目进行演示。
自定义T4模板需要引用两个非常重要的类库。
- Microsoft.VisualStudio.TextTemplating.10.0.dll
- Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll
在类库中引用上面两个类库,并创建一个类,实现自定义的模板引擎。
public class CustomTextTemplatingEngineHost : ITextTemplatingEngineHost, ITextTemplatingSessionHost
{
...
}
关于控制台项目,可按以下步骤进行。当然先看一下代码的结构会更好。
1、创建模板类,已完成T4模板中自定义的变量。
[Serializable]
public class Article
{
public string Title { get; set; }
public string Content { get; set; }
}
[Serializable]
public class MultiArticle
{
public string Subject { get; set; }
public List ArticleList { get; set; }
public MultiArticle(string subject, List articles)
{
Subject = subject; ArticleList = articles;
}
}
这里的类不需要定义为部分类。
2、新建一个T4模板,内容如下。
模板中需要定义变量,甚至包括命名空间等的引用,具有根据实际项目而定。
3、在Mian
方法中我们提供一个演示demo
。
CustomTextTemplatingEngineHost host = new CustomTextTemplatingEngineHost();
//模板的位置可根据实际情况放置
var templatePath = Path.Combine(Environment.CurrentDirectory,"MultiArticle.tt");
host.TemplateFile = templatePath;
string input = File.ReadAllText(templatePath);
host.Session = new TextTemplatingSession();
string subject = "最新消息";
var artList = new List();
for (int i = 0; i < 4; i++)
{
Article art = new Article();
art.Title = "标题" + i + ":" + Guid.NewGuid();
art.Content = "内容" + i + ":" + Guid.NewGuid();
artList.Add(art);
}
MultiArticle mod = new MultiArticle(subject, artList);
host.Session.Add("entity", mod);
string output = new Engine().ProcessTemplate(input, host);
File.WriteAllText(Path.Combine(Environment.CurrentDirectory,"test.html"), output);
基本的演示就这么多。这种方式个人觉得比较灵活,尤其是可以完成代码生成的相关代码生成工作。
4、结果和第一种方式的案例相同。
两种方式的比较- 灵活性来说,个人推荐第二种方式
- 关于T4模板
- 第一种方式的T4模板会自动生成一个
.cs
文件,就是靠这个文件才能生成最终的、我们需要的文件的。 - 而第二种方式只有一个T4模板文件就可以了。
- 第一种方式的T4模板会自动生成一个
以上就是关于T4模板的简单总结。希望对大家有所帮助。