2010-07-14 20 views
2

我正在使用Visual Studio 2010,並安裝了tangibleT4EditorPlusModellingTools。如何在VS2010中獲取T4以迭代類屬性

我只是在玩T4,從來沒有碰過它。我想要做的是看看項目中的一個類,並寫出每個屬性。

任何人都可以給我絕對的初學技巧,以.tt文件應該如何構建?我GOOGLE了這一點,並沒有找到答案,所以任何幫助,將不勝感激。

謝謝。

回答

3

這是真的很難爲T4模板和反射不一起玩。

見我的回答類似,可能重複,問題在這裏:

Generate columnheaders based on the DisplayName attribute?

更新:

我並不需要檢查我的回答,我已經在這條道路並發現反射+ t4模板有問題。其他回答者提供的平常例子並不能反映提問者試圖完成的任務的真實複雜性。嘗試使用更實際的反射目標,如自定義代碼,而不是.NET類。

之所以在我提供的鏈接,但由於其容易投我失望閱讀鏈接之前解釋清楚,我會在這裏發佈這樣的:

「訪問.NET元數據的一個明顯的第一選擇是反思。基於.NET基類庫,該API提供對.NET類型的元數據的訪問,不幸的是,Reflection針對代碼執行進行了優化,其中一個特殊限制使其不適合代碼生成 - 使用Reflection加載的程序集只能被卸載因爲T4模板被編譯爲.NET程序集並被緩存以提高代碼生成的性能,所以使用Reflection來訪問組件組件會導致T4鎖定它,這會阻止你改變/重新編譯組件,直到您關閉並重新打開解決方案。 「

+0

也許我的回答需要更多的細微差別。反思可以工作,但它需要在您更改任何內容時重新打開解決方案文件。因此,用反射代碼開發t4有太多的摩擦,它只是不是一種你可以使用的技術。任何人都應該嘗試使用自己改變的模型/域類,而不是靜態的.net api。 – jfar 2010-07-14 17:09:11

+1

我有一些類似的經歷,提到什麼jfar。 – JamesEggers 2010-07-14 17:23:06

+0

jfar,你對鎖定是正確的,但最初的問題是關於一個初學者玩t4,所以鎖定問題是irelevant,因爲它只是一個簡單的exersize學習t4 – tsinik 2010-07-15 06:45:40

6

在標籤中使用反射。

喜歡的東西:

<#foreach (PropertyInfo info in myObject.GetType().GetProperties()){#> 
    // do what you want with or any other property of info <#=info.Name#> 
<#}#> 

嘗試tuturials這裏 msdn

<#@ template debug="false" language="C#" #> 
<#@ output extension=".txt" #> 
<#@ assembly name="System.Xml"#> 
<#@ import namespace="System.Xml" #> 
<#@ import namespace="System.Reflection" #> 

<# 
XmlDocument doc = new XmlDocument(); 
foreach (PropertyInfo info in doc.GetType().GetProperties()){#> 
    <#=info.Name#> 
<#}#> 

將打印的XmlDocument的所有屬性

+1

這可能是正確的答案。你可以更具體一些(也許有一個代碼示例或鏈接),以便我可以upvote你? – 2010-07-14 16:02:23

+0

謝謝tsinik。 我也會進行更詳細的解釋。 – Paul 2010-07-14 16:05:35

+0

這裏是簡單的代碼示例 – tsinik 2010-07-14 16:09:09

4

如果您正在反思的程序集是您的項目的一部分(如原始問題提問者提到的那樣),那麼您將體驗到鎖定如前所述。

有作爲奧列格Sych發表的T4Toolbox CodePlex項目(http://t4toolbox.codeplex.com/),它提供了一個新的VolatileAssembly指令,它加載之前複製組件的一部分的臨時解決方案。

目前,我們正在努力解決這個在覈心T4引擎儘快實用。然而,如果你想使用你的項目中的代碼,你可能不想處理編譯後的程序集,而是處理磁盤上的源代碼,在這種情況下,VS中的CodeModel是另一種選擇(如果可以的話)在設計時只與在VS內部運行的模板共存)。

有一個這樣的例子在http://www.olegsych.com/2008/07/t4-template-for-generating-sql-view-from-csharp-enumeration/