2010-04-14 46 views

回答

10

使用T4模板可能会容易很多。 Here is a really good article on getting started

我在下面的例子中使用了一个直接的SQL连接,但正如你所看到的,你可以包含任何代码并生成你喜欢的任何输出到编译到你项目中的cs文件中。你可以用下面的ADO语法来代替通过你的Entituy Framework模型检索的对象集合并相应地输出。

在您希望生成枚举文件的目录中创建扩展名为.tt的文件。如果您将文件命名为XXXXX.tt,则会生成一个名为XXXXX.cs的文件,以便适当地命名该tt文件。

尝试沿着这些线。您可能需要对语法和输出进行一点实验,但是我不会为您编写所有内容,或者您​​不会学到任何东西:)

请注意,此数据库调用将会发生每次你编辑tt文件。

<#@ template language="C#" hostspecific="True" debug="True" #> 
<#@ output extension="cs" #> 
<#@ assembly name="System.Data" #> 
<#@ import namespace="System.Data" #> 
<#@ import namespace="System.Data.SqlClient" #> 
<# 
    SqlConnection sqlConn = new SqlConnection(@"Data Source=XXXX;Initial Catalog=XXXX; Integrated Security=True"); 
    sqlConn.Open(); 
#> 
namespace AppropriateNamespace 
{ 
public enum YourEnumName 
{ 
    <# 
    string sql = string.Format("SELECT Id, Name FROM YourTable ORDER BY Id"); 
    SqlCommand sqlComm = new SqlCommand(sql, sqlConn); 
    IDataReader reader = sqlComm.ExecuteReader(); 

    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    while (reader.Read()) 
    { 
     sb.Append(FixName(reader["Name"].ToString()) + " = " + reader["Id"] + "," + Environment.NewLine + "\t\t"); 
    } 
    reader.Close(); 
    sqlComm.Dispose(); 
    #> 
<#= sb.ToString() #> 
    } 
} 

尝试改进这一点。不是写入StringBuilder,而是输出每个reader的结果。直接读取()到输出。此外,我还包含了一个尚不存在的FixName方法,但您可能需要这样做才能取出空格或非法字符。

+0

我不知道笏是T4模板.. – 2010-04-14 09:20:05

+0

我目前正在寻找一个有用的链接 – 2010-04-14 09:21:42

+0

好的..谢谢... – 2010-04-14 09:23:18

7

丹尼尔的模板是好的,所有的,但我已经把一些更多的精力放在such a template所以它所有的这些:

  • 有明确的整数值产生枚举值;
  • 使用Visual Studio的命名空间命名约定,因此生成的枚举具有项目的默认命名空间和任何子文件夹(就像Visual Studio中的任何代码文件一样);
  • 通过使用附加的描述表列值来添加完整的枚举XML文档;如果你没有这些没关系;
  • 正确命名生成的文件并在代码中添加一个附加属性,以便生成的enum不会被代码分析检查;
  • 多字查询表值正确连接到pascal套装等价物(即多字值变为MultiWordValue);
  • 枚举值始终以字母开头;
  • 所有枚举值只包含字母和数字,其他所有值都被删除;

无论如何。在this blog post中,所有内容都非常详细。

+2

非常好。好后续 – 2013-05-10 22:55:14