T4嵌套模板,具有多个文件输出

Muh*_*adY 3 c# t4

我有一个模板,从数据库中读取需要生成的表和对象.没有问题,模板确实在cs文件中单独生成相关文件(很棒)我使用TemplateFileManager2.1来实现它.在这个表循环中,我想调用另一个模板,使用循环中的tablename创建该表所需的接口,并将该接口放在另一个文件中.

foreach (var table in tables)
    {  
        if(table.name !="sysdiagrams")
        {
        var manager2 = TemplateFileManager.Create(this);
            manager2.StartNewFile(table.name+"mm.cs","Generator","Deneme"); 
            InterfaceGeneratora(table.name);
            manager2.Process();
            manager2=null;


        manager.StartNewFile(table.name+".cs","Generator","GeneratedTables"); 
Run Code Online (Sandbox Code Playgroud)

这里manager对象用于输出表类,manager2用于接口.这里的poit是在调用manager2和InterfaceGeneratora(table.name)时; 运行manager2开始用新表intefarce替换创建的表接口,最后我创建了所有表类,但我手头上只有最后一个表接口.任何帮助表示赞赏.

Nic*_*ico 6

据我所知,模板文件管理器替换.Process()方法上所有以前生成的输出文件.所以你应该在模板的最后调用.Process()方法.

为了"外包"生成接口文件的代码,您也可以

  1. 在同一个模板中使用一个方法

    foreach(var table in tables)
    {
       if (table.name != "sysdiagrams")
       {
            manager.StartNewFile(table.name+"mm.cs", ...);
            // create interface code
       }
    
       manager.StartNewFile(table.name, ...);
       // create object code
    }
    manager.Process();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用包含通过<#@ include#>指令生成接口代码的方法的includable模板

    <#@ include file="interfaces.ttinclude" #>
    foreach(var table in tables)
    {
        if (table.name != "sysdiagrams")
            Interfacegeneratora(table.Name, manager);
    
        // generate object code
        manager.StartNewFile(table.name, ...);
        // generate object code here
    }
    manager.Process();
    
    Run Code Online (Sandbox Code Playgroud)

    文件"interfaces.ttinclude"包含类似的内容

    <#+ void Interfacegeneratora(string tableName, TemplateFileManager manager)
        {
            manager.StartNewFile(tableName + "mm.cs", ...);
            // generate interface code
        }
    #>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 手动处理另一个模板

    foreach(var table in tables)
    {
        if (table.name != "sysdiagrams")
        {
            var InterfaceT4 = new InterfaceTemplate();
            InterfaceT4.Session = new Dictionary<string, object>();
            InterfaceT4.Session.Add("tableName", table.name);
            InterfaceT4.Session.Add("manager", manager);
            InterfaceT4.InitializeSession();
            InterfaceT4.ProcessTemplate();
        }
    
        manager.StartNewFile(table.Name, ...);
        // generate object code
    }
    manager.Process();
    
    Run Code Online (Sandbox Code Playgroud)

    在哪里创建另一个T4模板,名为"InterfaceTemplate.tt",它是一个预处理模板.这实现了与.ttinclude文件相同的代码.

注意:代码不会经过双重检查,但会显示它应该如何工作.

希望有所帮助,尼科