• 【T4实践(四)】创建运行时模板


    【T4实践(四)】创建运行时模板

    使用 Visual Studio 预处理过的文本模板,可以在运行时在应用程序中生成文本字符串。 执行应用程序的计算机不必具有 Visual Studio。 预处理过的模板有时称为“运行时文本模板”。每个模板都包含将显示在生成的字符串中的文本和程序代码的片段。 程序片段为字符串的可变部分提供值,还控制条件部分和重复部分。

    创建运行时文本模板

    一、具体步骤:

    1、在解决方案资源管理器中,右击项目,指向“添加”,再单击“新建项”。


    2、在“添加新项”对话框中,选择“预处理文本模板”。 (在 Visual Basic 中的“常用项\常规”下查看。)

    3、键入模板文件的名称,如:MyWebPage

    4、单击“添加”。

       将创建一个扩展名为 .tt 的新文件。 该文件的“自定义工具”属性设置为 TextTemplatingFilePreprocessor。与之前讲到的设计时模板不同。

      设计时模板: TextTemplatingFileGenerator
      运行时模板:TextTemplatingFilePreprocessor

      模板转换:
      当然设计时模板可以转为运行时模板,只要将该文件的“自定义工具”属性设置为 TextTemplatingFilePreprocessor即可。
      但是运行时模板很多情况下不能转为设计时模板。后面的内容会帮我们揭开缘由。

    二、实例--显示课程网页

    在新建模板的同时,生成了模板的部分类。

    一个是以模板名+code结尾:MyWebPageCode.cs,在这里我们可以声明模板需要的变量、方法。

    这里我们需要设置课程集合。

        public partial class MyWebPage
    {
    private List<string> items;

    public List<string> Items
    {
    get { return items; }
    set { items = value; }
    }

    public MyWebPage(List<string> data) { this.items = data; }
    }


    另一个请展开 .tt 文件节点,此附属文件包含一个分部类,该类包含一个名为 TransformText() 的方法。这个方法中的内容会根据模板内容的变化而变化,其实就是模板代码转为C#代码。此方法可以从应用程序中调用。

    修改模板:

    <#@ template language="C#" #>
    <html>
    <body>
    <h1>计算机课程</h2>
    <table>
    <# foreach(string item in Items)
    { #
    >
    <tr><td>Course name : <#= item #> </td></tr>
    <# } #>
    </table>
    </body>
    </html>


    查看附属文件的部分类,方法:TransformText()

            public virtual string TransformText()
    {
    this.GenerationEnvironment = null;
    this.Write("<html>\r\n<body>\r\n<h1>计算机课程</h2>\r\n<table>\r\n ");

    #line 6 "D:\Code\C#\UFIDA.U8.UAP.EntityGenerator\PreTemplateTest\MyWebPage.tt"
    foreach(string item in Items)
    {

    #line default
    #line hidden
    this.Write(" <tr><td>Course name : ");

    #line 8 "D:\Code\C#\UFIDA.U8.UAP.EntityGenerator\PreTemplateTest\MyWebPage.tt"
    this.Write(this.ToStringHelper.ToStringWithCulture(item));

    #line default
    #line hidden
    this.Write(" </td></tr>\r\n ");

    #line 9 "D:\Code\C#\UFIDA.U8.UAP.EntityGenerator\PreTemplateTest\MyWebPage.tt"
    }

    #line default
    #line hidden
    this.Write(" </table>\r\n </body>\r\n </html>");
    return this.GenerationEnvironment.ToString();
    }

    程序调用,对模板变量赋值,并调用模板,输出文件。

            static void Main(string[] args)
    {
    List<string> items = new List<string>();
    items.Add("计算机基础");
    items.Add("数据库");
    items.Add("计算机网络");
    MyWebPage page = new MyWebPage(items);
    String pageContent = page.TransformText();
    //如果有汉字,需要设置编码格式
    System.IO.File.WriteAllText("outputPage.html", pageContent,Encoding.UTF8);
    }

    运行程序,生成模板:

    生成的HTML

    <html><body>
    <h1>计算机课程</h2>
    <table>
    <tr><td>Course name : 计算机基础 </td></tr>
    <tr><td>Course name : 数据库 </td></tr>
    <tr><td>Course name : 计算机网络 </td></tr>
    </table>
    </body></html>

    浏览器打开效果:


    在运行时生成文本,若要在特定命名空间中放置已生成的类,请设置文本模板文件的“自定义工具命名空间”属性。

    三、基本原理
    由上述实例,我们已经基本了解了运行时模板的基本步骤,现在总结一下运行时模板的基本原理。

    我们通常也通过C#输出文件,可能也要按照一定的格式来生成。其实这里的运行时模板,就是这样一个工具,设定好模板后,然后VS自动转为C#代码,在部分类中TransformText()方法,我们可以找到踪迹。

    运行时模板,简单的说就是可视化的C#代码生成器。

    运行时模板,提供了可视化功能,将夹杂在C#代码中的模板代码拿出来,让我们更加直观的看到模板的真实样子。方便进行修改和维护。

    运行时模板就好比C#代码,比起设计时模板,方便跟踪调试。

    四、源码下载

    点击下载


    五、后续,下一篇文章:设计时模板与运行时模板比较。


  • 相关阅读:
    单机 Nexus 部署
    Docker 部署 3 节点 ES 集群
    Harbor 高可用部署
    Python 第四次实验
    es入门
    Golang的Test的用法
    spring elastic
    golang下载包的时候出现 dial tcp 142.251.43.17:443: i/o timeout时候解决
    Java加密并压缩文件
    feign调用添加header
  • 原文地址:https://www.cnblogs.com/yank/p/2352507.html
Copyright © 2020-2023  润新知