有过前端开发经验的同学一定了解模板文件的重要用户。其实C#也有类似的模板功能(T4模板),不仅可以生成html文件,还可以生成代码。今天就给大家介绍一下。


什么是T4模板

T4模板全称是Text Template Transformation Toolkit,因为四个单词的开头字母都是T,所以称作T4模板。

T4模板是一种支持C#或者VB代码开发的模板格式,已经在Visual Studio,MonoDevelop,Rider这些主流IDE中得到支持。

T4不仅能支持在运行时动态生成Html网页这种常见需求,而且还可以在设计时生成各种语言的代码(不仅仅是C#),xaml,xml等以便于提升开发效率。

使用visualstudio创建一个T4模板

我们在项目上右键选择添加新项,在弹出的界面中搜索T4,可以得到两个结果。分别是文本模板(设计时T4模板)和运行时文本模板(运行时T4模板)。前者可以在开发时期或者编译时期生成,后者只能在运行时调用API生成。这里我们先选择文本模板。

image-20200303192301497

这时我们在项目内就多了一个后缀为tt的模板文件。

image-20200303193021735

我们把下面这段内容粘贴进去。注意如果是第一次使用vs可能会弹出一个提示框,选择确认即可。

<#@ 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" #>
//这个是生成代码
using System;
namespace ConsoleApp2
{
    public class GeneratedClass
    {
        static void Print()
        {
            Console.WriteLine("黄腾霄好帅!");
        }
    }
}

此时我们会发现多了一个同名的.cs文件,其中的代码就是我们刚刚粘贴的内容。

image-20200303193447359

更重要的是,生成的代码就在这个项目中,可以直接使用。

image-20200303193634749

使用代码辅助生成

光是生成静态文件肯定没啥意思,T4可以使用C#代码来辅助文件的生成。

我们下面使用这段代码填充带模板中。

<#@ 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" #>
//这个是生成代码
using System;
namespace ConsoleApp2
{
    class GeneratedClass
    {
        public static void Print()
        {
<#
             for (int i = 0; i < 5; i++)
            {
#>
            Console.WriteLine("黄腾霄好帅+<#=i+1#>!");
<#
            }
#>
        }
    }
}

这里所有被<# #>包围的代码是模板编译时会执行的代码。

这里的代码表示将Console.WriteLine("黄腾霄好帅+<#=i+1#>!");在生成文件中输出5次。

其中<#=i+1#>表示将表达式i+1的值转为字符串填充至模板的生成文件中。

结果如下

image-20200303195114635

值得注意的是,这里的i+1输出随着循环进行而更新。这说明所在的模板中的代码块都隶属于同一个上下文。

可以实现变量的传递。

More

至此相信你已经可以使用T4模板完成基本的代码生成功能开发了。当然本文作为入门介绍还有很多细节没有介绍。这里可以在微软的官方文档中找到更加详细的介绍:Writing a T4 Text Template - Visual Studio -Microsoft Docs

当然也可以关注我之后关于T4模板的系列博客。


参考文档:


本文会经常更新,请阅读原文: https://dotnet-campus.github.io//post/%E4%BD%BF%E7%94%A8T4%E6%A8%A1%E6%9D%BF%E8%BF%9B%E8%A1%8CC-%E4%BB%A3%E7%A0%81%E7%94%9F%E6%88%90.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 dotnet 职业技术学院 (包含链接: https://dotnet-campus.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系