T4模板生成枚举

Nic*_*ckz 18 t4 linq-to-sql

我正在寻找创建一个T4模板来生成我的数据库的枚举.本质上,我想要与SubSonic相同的功能,例如Linq-to-SQL或Entity Framework 4的Product.Columns.ProductId.

任何帮助将非常感激.谢谢.

Rob*_*nik 34

我已根据我的需求编写了一个将您选择的查找表转换为枚举:将此代码放在EnumGenerator.ttinclude文件中:

<#@ template debug="true" hostSpecific="true" #>
<#@ output extension=".generated.cs" #>
<#@ Assembly Name="System.Data" #>
<#@ import namespace="System.Data" #>
<#@ import namespace="System.Data.SqlClient" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Text.RegularExpressions" #>
<#
    string tableName = Path.GetFileNameWithoutExtension(Host.TemplateFile);
    string path = Path.GetDirectoryName(Host.TemplateFile);
    string columnId = tableName + "ID";
    string columnName = "Name";
    string connectionString = "data source=.;initial catalog=DBName;integrated security=SSPI";
#>
using System;
using System.CodeDom.Compiler;

namespace Services.<#= GetSubNamespace() #>
{
    /// <summary>
    /// <#= tableName #> auto generated enumeration
    /// </summary>
    [GeneratedCode("TextTemplatingFileGenerator", "10")]
    public enum <#= tableName #>
    {
<#
    SqlConnection conn = new SqlConnection(connectionString);
    string command = string.Format("select {0}, {1} from {2} order by {0}", columnId, columnName, tableName);
    SqlCommand comm = new SqlCommand(command, conn);

    conn.Open();

    SqlDataReader reader = comm.ExecuteReader();
    bool loop = reader.Read();

    while(loop)
    {
#>      /// <summary>
        /// <#= reader[columnName] #> configuration setting.
        /// </summary>
        <#= Pascalize(reader[columnName]) #> = <#= reader[columnId] #><# loop = reader.Read(); #><#= loop ? ",\r\n" : string.Empty #>
<#
    }
#>  }
}
<#+
    private string Pascalize(object value)
    {
        Regex rx = new Regex(@"(?:[^a-zA-Z0-9]*)(?<first>[a-zA-Z0-9])(?<reminder>[a-zA-Z0-9]*)(?:[^a-zA-Z0-9]*)");
        return rx.Replace(value.ToString(), m => m.Groups["first"].ToString().ToUpper() + m.Groups["reminder"].ToString().ToLower());
    }

    private string GetSubNamespace()
    {
        Regex rx = new Regex(@"(?:.+Services\s)");
        string path = Path.GetDirectoryName(Host.TemplateFile);
        return rx.Replace(path, string.Empty).Replace("\\", ".");
    }
#>
Run Code Online (Sandbox Code Playgroud)

然后,只要你想要生成枚举,只需创建一个与UserType.tt等数据库表同名的tt文件,并将此代码放入:

<#@ include file="..\..\T4 Templates\EnumGenerator.ttinclude" #>
Run Code Online (Sandbox Code Playgroud)

我的博文中现在提供了更高级的模板.

  • 那太光滑了.我在考虑自己做这件事,但是你给我省了麻烦. (2认同)
  • @David Lively:谢谢.我在几个项目中使用了这个,所以我认为我也应该与其他人分享. (2认同)