2010-08-07 157 views
2

我剛剛開始玩T4,因爲我最終希望使用它來生成映射到LINQ to SQL實體類的POCO,但即使是最簡單的示例也讓我略感困惑。有關發生什麼的一些建議,以及一些良好的閱讀建議,將不勝感激。疑難解答T4

我的理解是,下面的模板應該產生一個只包含文本的文件Hello World!,但它生成一個輸出文本Hello World的類!我如何得到我的簡單和簡單Hello World只有文件?

模板:

<#@ template language="C#"#> 
<#@ output extension=".cs" #> 
class HelloWorld 
{ 

} 

輸出:

#line 1 "C:\Development\PocoGenerator\PocoGenerator\HelloWorld.tt" 
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "10.0.0.0")] 
public partial class HelloWorld : HelloWorldBase 
{ 
    public virtual string TransformText() 
    { 
     this.GenerationEnvironment = null; 
     this.Write("class HelloWorld\r\n{\r\n\r\n}\r\n\r\n"); 
     return this.GenerationEnvironment.ToString(); 
    } 
} 

#line default 
#line hidden 

這之後是在同一個輸出文件中的相對複雜HelloWorldBase類。在我看來,這是一個應該用於生成實際預期的模板實現的中間類,但是應該怎麼做纔會發生?

回答

3

ProfK,

您正在尋找由preprocessed template產生的結果。如果您在Visual Studio的新項目項目對話框中選擇常規「文本模板」,您將看到完整的轉換結果。

奧列格

+1

你先生,是明星! – ProfK 2010-08-08 17:23:21

1

從未見過......你的情況輸出應該僅僅是:

class HelloWorld 
{ 
} 

剛剛進行了測試,這就是它產生在這裏...

什麼是自定義工具爲你的.tt文件?您可以通過右鍵單擊解決方案資源管理器中的文件並選擇「屬性」來檢查。它應該是'TextTemplatingFileGenerator'。

在T4中,<##>之間的所有內容都被解釋爲代碼(本例中爲C#)。與ASP.Net的<%=<%:類似,您也可以使用'<#='將語句自動轉換爲字符串。因此,爲了簡單地輸出的 'Hello World' 您可以使用文字文本:

<#@ template language="C#"#> 
<#@ output extension=".cs" #> 
Hello World 

或使用本:

<#@ template language="C#"#> 
<#@ output extension=".cs" #> 
<#= "Hello World" #> 

甚至另一種方式:

<#@ template language="C#"#> 
<#@ output extension=".cs" #> 
<# var text = "Hello World"; #> 
<#= text #> 

現在,更根本地

+0

謝謝。出於某種原因,自定義工具是「TextTemplatingFilePreprocessor」。我更改爲 - 發電機,並按預期工作。 – ProfK 2010-08-08 09:18:50