Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# T4具有多个文件输出的嵌套模板_C#_T4 - Fatal编程技术网

C# T4具有多个文件输出的嵌套模板

C# T4具有多个文件输出的嵌套模板,c#,t4,C#,T4,我有一个模板,可以从数据库中读取需要生成为和对象的表。在这方面没有问题,模板确实生成了相关的文件,每个文件单独放在一个cs文件中(很好),我使用TemplateFileManager2.1来实现这一点。在tables循环中,我想调用另一个模板,使用循环中的tablename创建该表所需的接口,并将该接口放在另一个文件中 foreach (var table in tables) { if(table.name !="sysdiagrams") {

我有一个模板,可以从数据库中读取需要生成为和对象的表。在这方面没有问题,模板确实生成了相关的文件,每个文件单独放在一个cs文件中(很好),我使用TemplateFileManager2.1来实现这一点。在tables循环中,我想调用另一个模板,使用循环中的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"); 

这里,manager对象用于输出tables类,manager2用于接口。这里的要点是调用manager2和接口generatora(table.name)的时间;运行manager2开始用新的表intefarce替换创建的表接口,最后我创建了所有表类,但我手头只有最后一个表接口。感谢您的帮助

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

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

  • 在同一模板内使用方法

    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();
    
  • 使用包含通过指令生成接口代码的方法的可包含模板

    <#@ 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();
    
    
    foreach(表中的var表)
    {
    if(table.name!=“系统图”)
    接口发电机(表名、经理);
    //生成目标代码
    manager.StartNewFile(table.name,…);
    //在这里生成目标代码
    }
    manager.Process();
    
    其中文件“interfaces.ttinclude”包含如下内容

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

    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();
    
    foreach(表中的var表)
    {
    if(table.name!=“系统图”)
    {
    var InterfaceT4=新的InterfaceTemplate();
    InterfaceT4.Session=新字典();
    接口4.Session.Add(“tableName”,table.name);
    接口4.会话。添加(“经理”,经理);
    InterfaceT4.InitializeSession();
    InterfaceT4.ProcessTemplate();
    }
    manager.StartNewFile(table.Name,…);
    //生成目标代码
    }
    manager.Process();
    
    创建另一个名为“InterfaceTemplate.tt”的T4模板,它是一个预处理的模板。实现与.ttinclude文件相同的代码

  • 注意:代码没有经过双重检查,但显示了它应该如何工作

    希望有帮助, 尼科