【问题标题】:Problem with T4 TemplatesT4 模板的问题
【发布时间】:2009-07-28 00:47:49
【问题描述】:

我有以下代码,它与花括号和其他东西有关。

<#@ template language="C#" debug="True" hostspecific="True" #>
<#@ output extension=".cs" #>
<#@ assembly name="System.Data" #>

<#@ assembly name="System.xml" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Data.SqlClient" #>

namespace MyProject.Entities 
{   
    public class     
    {
        <#
        string connectionString = 
            "Server=localhost;Database=GridViewGuy;Trusted_Connection=true"; 
        SqlConnection conn = new SqlConnection(connectionString); 
        conn.Open(); 
        System.Data.DataTable schema = conn.GetSchema("TABLES"); 

        foreach(System.Data.DataRow row in schema.Rows) 
        { 

        #> 

        public class <#= row["TABLE_NAME"].ToString() #>            


        {

        }               

        } 

    }   

}

谁能发现问题?

【问题讨论】:

    标签: .net t4


    【解决方案1】:

    它没有编译的原因是因为&lt;# #&gt;标签内的foreach块没有对应的右大括号。您需要进行以下更改:

    foreach(System.Data.DataRow row in schema.Rows)                 
    {                 
    #>                 
      public class <#= row["TABLE_NAME"].ToString()#> 
      {                
      } 
    <#
      } //this was missing.
    #> 
    

    此外,请记住,您的代码将创建一个没有名称的类,后跟一个包含表名称的嵌套类列表。像这样:

    public class
    {
      public class Table1
      {
      }
    
      public class Table2
      {
      }
      //... and so on..
    }
    

    这可能不是您想要完成的。

    【讨论】:

    • 您应该为 Visual Studio 安装有形 T4 编辑器插件。它将为您提供匹配的大括号突出显示,使这种事情非常容易弄清楚。 visualstudiogallery.msdn.microsoft.com/en-us/…
    • 有形很酷,直到您意识到智能感知充其量是缓慢且参差不齐的,并且您无法在模板中插入断点。
    【解决方案2】:

    在你的第一个块中,你开始一个代码块

                foreach(System.Data.DataRow row in schema.Rows) 
                { 
    
                #> 
    

    但永远不要终止它。在下面的某个地方你需要这个:

                <# } #>
    

    edit - 看起来它将是嵌套类定义下方的右花括号

    【讨论】: