调用T4运行时文本模板

在C# Console程序中调用T4的运行时文本模板生成代码

原理图:
  1. 在Visual Studio 2010中创建一个新console项目, 添加一个简单的Customer类

    public class Customer
    {
        public string Name { get; set; }
        public DateTime LastLoginDate { get; set; }
    }
  2. 在项目中新增一个预处理过的文本模板(Preprocessed Text Template,VS2017等改名为运行时文本模板,Runtime Text Template),命名为CustomerEmailTemplate.tt.

    运行时文本模板的自定义工具属性为TextTemplatingFilePreprocessor。与传统T4模板不同,每个运行时文本模板都自动生成同名的cs文件,定义同名的类对象。调用其TransformText()方法就能获得转换结果。

    下图为使用了第三方T4插件(Tangible T4)后的IDE编辑框:

  3. 撰写模板内容

    按T4模板语法,写一个简单的文本模板如下:

    <#@ template language="C#" #>
    <#@ parameter
     name="Customer"
        type="ConsoleApplication1.Customer" #>//入参声明,对应产生同名cs文件Initialize方法
    Hi <#= Customer.Name #>,
    Thanks for logging onto our application on <#=
     Customer.LastLoginDate.ToString("d MMMM yyyy") #>!
    Please be sure to come back again soon!
    The Email Generation Co.
  4. 使用模板

    在Main方法中加入如下代码

    var customer = new Customer
    {
        Name = "Jeffery",
        LastLoginDate = new DateTime(2009, 11, 2, 19, 23, 32)
    };
    
    //1,创建模板的新实例
    var template = new CustomerEmailTemplate();
    //2,通过设置与初始化session(一个键值对的字典)来传入模板参数
    template.Session = new Dictionary<string, object>()
    {
        { "Customer", customer }
    };
    template.Initialize();
    //3,调用TransformText方法输出生成的代码内容
    Console.WriteLine(template.TransformText());
  5. 运行代码

参见

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

  2. 使用 T4 文本模板的运行时文本生成

  3. CODE-透過程式執行T4範本

  4. Can I use T4 programmatically from C#?

  5. Creating T4 templates at runtime (build-time)?

  6. Understanding T4: Preprocessed Text Templates

  7. Goatly.net - Using T4 to generate content at runtime

  8. DSL 2010 Feature Dives- T4 Preprocessing - Part One - Rationale by Gareth Jones

  9. DSL 2010 Feature Dives- T4 Preprocessing - Part Two - Basic Design by Gareth Jones

  10. VS10 Beta 1 / T4 Preprocessing part 1 by Pablo Galiano

  11. VS10 Beta 1 / T4 Preprocessing part 2 by Pablo Galiano

  12. Why is a Preprocessed Template the Coolest Thing since Sliced Bread by Kathleen Dollard