栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

.NET中关于T4模板的使用

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.NET中关于T4模板的使用

文章目录
  • 介绍
    • 简单说下什么是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的内容如下。

<#@ 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=".html" #>


    
<#=Subject #> <# foreach(Article item in ArticleList) { #> <# } #>
<#= item.Title #> <#= item.Content #>

这里需要注意的是,模板的名称一定要和类的名称一样。另外就是模板名称右击==》属性后,【自定义工具】中的内容需要改为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模板引擎

关于此方式,一般建议单独建立一个类库作为模板引擎使用。所以我们会建立一个单独的类库,在建立一个控制台项目进行演示。

自定义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模板,内容如下。

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".html" #>
<#@ import namespace="CustomTextConsole" #>
<#@ parameter type="CustomTextConsole.MultiArticle" name="entity" #>


    
<#= entity.Subject #> <# foreach(Article item in entity.ArticleList) { #> <# } #>
<#= item.Title #> <#= item.Content #>

模板中需要定义变量,甚至包括命名空间等的引用,具有根据实际项目而定。

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模板的简单总结。希望对大家有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/979969.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号