2014-09-10 98 views
2

如何在TT文件中使用全局變量?你可以在t4模板中使用全局變量嗎?

如果我在頭文件中聲明一個變量,如果我在函數中引用它,會得到一個編譯錯誤。

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ output extension=".cs" #> 
<# 
    int ValueForThisFile = 35; 

    SomeFunction(); 
#> 

<#+ 
void SomeFunction() { 
#> 
    public void GeneratedCode() { 
     int value = <#=ValueForThisFile#>; 
    } 
<#+ 
} 
#> 

我知道我可以把它作爲一個說法,但也有上百個電話,這將是更嚴格的語法,如果我能避免這種情況。如果這是一個文件,我可以硬編碼該值,但有幾十個文件具有不同的設置和常見的包含文件來生成代碼。

回答

3

我不認爲這是可能的。當T4解析你的模板時,它實際上是生成一個類。所有<##>內容都被注入到該類的單個方法中,而所有<#+#>標記都作爲該類的方法添加,允許您從單個方法<##>標記中調用它們。所以「ValueForThisFile」變量的範圍僅限於該單一方法。舉個簡單的例子,這個模板:

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ output extension=".cs" #> 
<# 
    int ValueForThisFile = 35; 

    SomeFunction(); 
#> 

<#+ 
void SomeFunction() { 
    return ValueForThisFile; 
} 
#> 

會產生這樣一個類:

class T4Gen { 

private void MainWork() { 
    int ValueForThisFile = 35; 
    this.SomeFunction(); 
} 

private void SomeFunction{ 
    return ValueForThisFile; 
} 

} 

變量「ValueForThisFile」只是作用域爲MainWork功能。 T4生成的實際類要複雜得多,但正如你所看到的那樣,沒有辦法在代碼中擁有全局變量。

+0

謝謝你,弗蘭克。我注意到這是一堂課,因爲我注意到我可以調用其他功能,但對結構沒有大概的瞭解。 – 2014-09-11 12:09:24

+1

如果您想查看生成的類,可以在模板標籤上將debug屬性設置爲true,它將保存生成的文件。這裏是MS解釋它的[docs](http://msdn.microsoft.com/en-us/library/gg586945.aspx)。查看調試屬性部分,它介紹瞭如何將中間代碼文件寫入%Temp%目錄。 – Frank 2014-09-11 13:07:20

+1

因此,在查看[docs](http://msdn.microsoft.com/zh-cn/library/bb126545.aspx)後,更多地指出<#+ #>(Class Feature Blocks)類標記可以包含方法,字段和屬性。從理論上講,你放在這些塊中的代碼將被注入到類的主體中,這樣你就可以放置一個「private int ValueForThisFile;」語句在<#+ #>中,並且能夠從<# #>中設置,並且仍然能夠從其他<#+ #>塊中定義的方法主體訪問它 – Frank 2014-09-11 17:50:10

1

構建你這樣的T4腳本可能的幫助,我已經用在我的項目類似的方法成功: -

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ output extension=".cs" #> 
<#  
    var Context = new ScriptContext(); 
    Context.SomeFunction(); 
#> 
// This file is generated by Build/Info.tt, do not modify! 
void SomeFunction() { 
    public void GeneratedCode() { 
     int value = <#=Context.ValueForThisFile#>; 
    } 
} 

<#+ 
public class ScriptContext { 
    public int ValueForThisFile = 35; 

    public void SomeFunction() 
    { 
     ValueForThisFile = 42; 
    } 
} 
#> 
相關問題