2010-04-14 47 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