2013-02-05 115 views
4

我正在嘗試爲代碼生成編寫一些漂亮且結構化的t4。我將我的邏輯分解爲可重用的函數,並將它們放入單獨的文件中(就像「普通」代碼一樣)。問題是我不能包含一個通用文件,因爲它將被包含多次。包含文件的T4「頭文件」

例如,我有4個文件:Core.tt,File1.tt,File2.ttMainTemplate.ttCore.tt包含在File1.ttFile2.tt。 雖然File1.ttFile2.tt包括在MainTemplate.tt

當我想從我MainTemplate.tt收到以下錯誤產生的輸出:

Error 8 Compiling transformation: The type 'Microsoft.VisualStudio.TextTemplating62CD98C8FF0EB737CAFBD5ED17A158C3.GeneratedTextTransformation' already contains a definition for 'PropertyAttribute' 

我想,其原因是Core.tt已包含了兩次。有沒有解決我的問題的方法?在C++中可以添加頭文件:#ifndef xxx #define xxx #endif

+0

我花了不到2個小時寫一個相當於T4這既解決了這個問題,並重新轉換所有依賴模板時庫模板變化的問題。 T4設計不好。不要使用它。 – Jack

+0

@Jack:你會介意爲T4項目做貢獻嗎? – Vlad

回答

1

不幸的是,我還沒有能夠找到一種方法來實現它,因爲在C#中可以使用#define的地方存在很大的侷限性,代碼中#include來得太晚。

在這一點上最好的選擇是登錄http://visualstudio.uservoice.com的功能請求,並嘗試鼓勵一些支持。

就我個人而言,我很想將此功能加入到產品中。

0

我是有以下錯誤消息類似的問題:

Compiling transformation: The type 'GeneratedTextTransformation' already contains a definition for 'BaseCodegenTemplate' 

我搜索我的CTRL + SHIFT + ˚F這行文字的項目:

<#@ include file="BaseCodegenTemplate.tt" #> 

,並在2個不同的文件中發現了2行。在我從其中一個文件中刪除了一個事件後,錯誤消失了。

但是因爲現在在該文件中缺少了BaseCodegenTemplate.tt文件的包含語句,所以該文件中的某些代碼以紅色突出顯示,因爲BaseCodegenTemplate.tt中包含的類型定義丟失。但整體代碼編譯良好:在構建過程中包含BaseCodegenTemplate.tt中定義的類型,因爲BaseCodegenTemplate.tt在另一個文件中被引用。

2

是的,此功能內置於T4系統。

The T4 'include' directive supports a 'once' attribute,應確保模板只包含一次,防止重複。

例子:

<#@ include file="filePath.tt" once="true" #> 
+0

這是一個好主意!但由於某種原因,我在編譯時出錯:「意外屬性:一次」。我包含這樣的文件:「<#@ include file =」BaseCodegenTemplate.tt「once =」true「#>」。你知道這是爲什麼嗎? 我正在使用Visual Studio 2015 Update 3和T4 Toolbox for Visual Studio 14.0.0.76。 –