日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#T4模板

發布時間:2025/3/17 C# 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#T4模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

T4(Text Template Transformation Toolkit)是微軟官方在VisualStudio 2008中開始使用的代碼生成引擎。在 Visual Studio 中,“T4 文本模板”是由一些文本塊和控制邏輯組成的混合模板,它可以生成文本文件。 在 Visual C# 或 Visual Basic 中,控制邏輯編寫為程序代碼的片段。生成的文件可以是任何類型的文本,例如網頁、資源文件或任何語言的程序源代碼。現在的VS中只要與代碼生成相關的場景基本上都能找T4的身影,比如MVC的視圖模板,Entity Framwork的DataContext模板等等。

?我們先來創建一個試試

?

T4 文本模板有兩種類型

  • 設計時模版

  可在應用程序中執行運行時 T4 文本模板(“預處理過的”模板)以便生成文本字符串(通常作為其輸出的一部分)。

  若要創建運行時模板,請向您的項目中添加“已預處理的文本模板”文件。?另外,您還可以添加純文本文件并將其“自定義工具”屬性設置為“TextTemplatingFilePreprocessor”。

  有關更多信息,請參見使用預處理 T4 文本模板生成運行時文本。?有關模板語法的更多信息,請參見編寫 T4 文本模板。

  • 運行時模版

  在 Visual Studio 中執行設計時 T4 文本模板,以便定義應用程序的部分源代碼和其他資源。

  通常,您可以使用讀取單個輸入文件或數據庫中的數據的多個模板,并生成一些?.cs、.vb?或其他源文件。?每個模板都生成一個文件。?在 Visual Studio 或 MSBuild 內執行它們。

  若要創建設計時模板,請向您的項目中添加“文本模板”文件。?另外,您還可以添加純文本文件并將其“自定義工具”屬性設置為“TextTemplatingFileGenerator”。

  有關更多信息,請參見使用 T4 文本模板生成設計時代碼。?有關模板語法的更多信息,請參見編寫 T4 文本模板。 

文本模板由以下部件組成:

指令?- 控制模板處理方式的元素。

文本塊?- 直接復制到輸出的內容。

控制塊?- 向文本插入可變值并控制文本的條件或重復部件的程序代碼。 

?

T4 文本模板指令

?

?

  • T4模版指令? <#@ template [language="C#"] [compilerOptions="options"] [culture="code"] [debug="true"] [hostspecific="true"] [inherits="templateBaseClass"] #>

    ?

  • 模版指令中所有特性均為可選的
  • langeuage:輸出語言,有效值C#、VB,默認為C#
  • debug:是否啟用調試,有效值true、false,默認為false。特別說明下這個調試真的不咋地,很容易讓VS崩潰,很雞肋的功能,
  • hostspecific:有效值true、false,默認為false。如果將此特性的值設置為?true,則會將名為?Host?的屬性添加到由文本模板生成的類中。?該屬性是對轉換引擎的宿主的引用,并聲明為Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost。
  • inherits:可以指定模板的程序代碼可以繼承自另一個類,這個類也可以從文本模板生成。目前木有使用過,基本上可以忽略
  • compilerOptions:有效值為任何有效的編譯器選項。基本上可以忽略?
    • T4 參數指令 <#@ parameter type="Full.TypeName" name="ParameterName" #>

       顧名思義,就是用來傳參的,應該是用在運行時模版的(預處理模版)

    • T4 輸出指令 <#@ output extension=".fileNameExtension" [encoding="encoding"] #>

      比較重要的指令,用于設置輸出文件的后綴名和文件編碼
      extension:輸出文件擴展名,默認為".cs"
      encoding:文件編碼,默值為utf-8(這里不能確定,我測試是utf-8)

    • T4 程序集指令 <#@ assembly name="[assembly strong name|assembly file name]" #>

      ?

  • 程序集指令相當于VS里面我們添加程序集引用的功能,該指令只有一個參數name,用以指定程序集名稱,如果程序集已經在GAC里面注冊,那么只需要寫上程序集名稱即可,如<#@?assembly?name="System.Data.dll"?#>,否則需要指定程序集的物理路徑。
  • T4模版的程序集引用是完全獨立的,也就是說我們在項目中引用了一些程序集,然后項目中添加了一個T4模版,T4模版所需要的所有程序集引用必須明確的在模版中使用程序集執行引用才可以。
  • T4模版自動加載以下程序集Microsoft.VisualStudio.TextTemplating.1*.dll、System.dll、WindowsBase.dll,如果用到了其它的程序集需要顯示的使用程序集添加引用才可以
  • 可以使用 $(variableName) 語法引用 Visual Studio 或 MSBuild 變量(如 $(SolutionDir)),以及使用 %VariableName% 來引用環境變量。介紹幾個常用的$(variableName) 變量:
  •     $(SolutionDir):當前項目所在解決方案目錄

        $(ProjectDir):當前項目所在目錄

        $(TargetPath):當前項目編譯輸出文件絕對路徑

        $(TargetDir):當前項目編譯輸出目錄,即web項目的Bin目錄,控制臺、類庫項目bin目錄下的debug或release目錄(取決于當前的編譯模式)

        舉個例子:比如我們在D盤根目錄建立了一個控制臺項目TestConsole,解決方案目錄為D:\LzrabbitRabbit,項目目錄為
        D:\LzrabbitRabbit\TestConsole,那么此時在Debug編譯模式下
        $(SolutionDir)的值為D:\LzrabbitRabbit
        $(ProjectDir)的值為D:\LzrabbitRabbit\TestConsole
        $(TargetPath)值為D:\LzrabbitRabbit\TestConsole\bin\Debug\TestConsole.exe
        $(TargetDir)值為D:\LzrabbitRabbit\TestConsole\bin\Debug\

    • T4 導入指令 <#@ import namespace="namespace" #>

       在 Visual Studio T4 文本模板的代碼塊中,import 指令允許您在不提供完全限定名稱的情況下引用另一個命名空間中的元素。 它等效于 C# 中的 using 或 Visual Basic 中的 imports。默認已經導入了System命名空間的引用。

    • T4 包含指令 <#@ include file="filePath" #>

      ?

  • filePath 可以是絕對的,或相對于當前模板文件。
  • filePath 可以包括用“%”分隔的環境變量。 例如:<#@ include file="%HOMEPATH%\MyIncludeFile.t4" #>
  • 所包含的文件的名稱不必使用擴展名“.tt”。可能需要針對包含的文件使用其他擴展名,例如,“.t4”。 這是因為,在您將 .tt 文件添加到項目中時,Visual Studio 會自動將其“自定義工具”屬性設置為 TextTemplatingFileGenerator。 您通常不希望單獨轉換包含的文件。
  • 在處理時,被包含內容就像是包含文本模板的組成部分一樣。 不過,即使 include 指令后為普通文本塊和標準控制塊,也可以包括含有類功能塊 <#+...#> 的文件。
  • 包含指令可以提高代碼復用率,比如我們可以將一些常用的程序集、命名空間引用放到一個文件里,使用時僅需要引用下即可,省去了每次都要重新引用一遍的煩惱,如我們建立Reference.ttinclude文件,里面包含了我們平時常用的程序集引用 <#@ assembly name="System.Core.dll" #> <#@ assembly name="System.Data.dll" #> <#@ assembly name="System.Data.DataSetExtensions.dll" #> <#@ assembly name="System.Xml.dll" #> <#@ import namespace="System" #> <#@ import namespace="System.Xml" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Data" #> <#@ import namespace="System.Data.SqlClient" #> <#@ import namespace="System.Collections.Generic" #> <#@ import namespace="System.IO" #> 使用時只需要使用包含指令引用下即可 <#@ include file="$(ProjectDir)Reference.ttinclude" #>

    ?

  • ?文本塊

    ?文本塊直接向輸出文件插入文本。?文本塊沒有特殊格式。

    <#@ output extension=".txt" #> Hello World!

    控制塊

    控制塊是用于轉換模板的程序代碼節,默認語言是 C#,但若要使用 Visual Basic,可以在文件開頭編寫以下指令:

    ?

    <#@ template language="VB" #>

    用于編寫控制塊代碼的語言與生成的文本的語言無關。

    標準控制塊

    標準控制塊是生成輸出文件部件的程序代碼節。
    在模板文件中,可以混合使用任意數量的文本塊和標準控制塊。 但是,不能在控制塊中嵌套控制塊。 每個標準控制塊都以 <# ... #> 符號分隔。
    例如,如果使用下面的控制塊和文本塊,則輸出文件包含行“0, 1, 2, 3, 4 Hello!”:

    <#for(int i = 0; i < 4; i++){Write(i + ", ");}Write("4"); #> Hello!

    在代碼中,可以使用 Write(); 語句的位置都可以插入文本塊。?

    表達式控制塊

    表達式控制塊計算表達式并將其轉換為字符串。 該字符串將插入到輸出文件中。
    表達式控制塊以 <#= ... #> 符號分隔。
    例如,如果使用下面的控制塊,則輸出文件包含“5”:?

    <#= 2 + 3 #>

    類功能控制塊

    類功能控制塊定義屬性、方法或不應包含在主轉換中的所有其他代碼。 類功能塊常用于編寫幫助器函數。 通常,類功能塊位于單獨的文件中,這樣它們可以包含在多個文本模板中。
    類功能控制塊以 <#+ ... #> 符號分隔,可以簡單的認為<#+ ...#>定義的內容為我們的類文件
    例如,下面的模板文件聲明并使用一個方法:

    <#@ output extension=".txt" #> Squares: <#for(int i = 0; i < 4; i++){ #>The square of <#= i #> is <#= Square(i+1) #>. <#} #> That is the end of the list. <#+ // Start of class feature block private int Square(int i) {return i*i; } #>

    類功能必須編寫在文件末尾。 不過,即使 include 指令后跟標準塊和文本,也可以 <#@include#> 包含類功能的文件。
    類功能塊可以包含文本塊
    可以編寫生成文本的方法。

    ?

    ?

    一名正在搶救的coder

    筆名:mangolove

    CSDN地址:https://blog.csdn.net/mango_love

    GitHub地址:https://github.com/mangoloveYu

    總結

    以上是生活随笔為你收集整理的C#T4模板的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。