Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
En textmall innehåller den text som ska genereras från den. Till exempel innehåller en mall som skapar en webbsida "<html>..." och alla andra standarddelar på en HTML-sida. I mallen infogas kontrollblock, som är fragment av programkod. Kontrollblock ger varierande värden och tillåter att delar av texten villkoras och upprepas.
Den här strukturen gör det enkelt att utveckla en mall eftersom du kan börja med en prototyp av den genererade filen och inkrementellt infoga kontrollblock som varierar resultatet.
Textmallar består av följande delar:
Direktiv – element som styr hur mallen bearbetas.
Textblock – innehåll som kopieras direkt till utdata.
Kontrollblock – programkod som infogar variabelvärden i texten och styr villkorsstyrda eller upprepade delar av texten.
Om du vill testa exemplen i det här avsnittet kopierar du dem till en mallfil enligt beskrivningen i Design-Time Kodgenerering med hjälp av T4-textmallar. När du har redigerat mallfilen sparar du den och kontrollerar sedan filen .txt för utdata.
Direktiv
Textmallsdirektiv ger allmänna instruktioner till textredigeringsmotorn om hur du genererar transformeringskoden och utdatafilen.
Följande direktiv anger till exempel att utdatafilen ska ha ett .txt-tillägg:
<#@ output extension=".txt" #>
Mer information om direktiv finns i T4-direktiv för textmallar.
Textblock
Ett textblock infogar text direkt i utdatafilen. Det finns ingen särskild formatering för textblock. Följande textmall skapar till exempel en textfil som innehåller ordet "Hello":
<#@ output extension=".txt" #>
Hello
Kontrollblock
Kontrollblock är avsnitt i programkod som används för att transformera mallarna. Standardspråket är C#, men om du vill använda Visual Basic kan du skriva det här direktivet i början av filen:
<#@ template language="VB" #>
Språket där du skriver koden i kontrollblocken är inte relaterat till språket för den text som genereras.
Standardkontrollblock
Ett standardkontrollblock är ett avsnitt av programkoden som genererar en del av utdatafilen.
Du kan blanda valfritt antal textblock och standardkontrollblock i en mallfil. Du kan dock inte placera ett kontrollblock i ett annat. Varje standardkontrollblock avgränsas av symbolerna <# ... #>.
Följande kontrollblock och textblock gör till exempel att utdatafilen innehåller raden "0, 1, 2, 3, 4 Hello!":
<#
    for(int i = 0; i < 4; i++)
    {
        Write(i + ", ");
    }
    Write("4");
#> Hello!
I stället för att använda explicita Write() instruktioner kan du fläta samman text och kod. I följande exempel skrivs "Hello!" ut fyra gånger:
<#
    for(int i = 0; i < 4; i++)
    {
#>
Hello!
<#
    }
#>
Du kan infoga ett textblock där en Write(); instruktion tillåts i koden.
Anmärkning
När du bäddar in ett textblock i en sammansatt instruktion, till exempel en loop eller villkorsstyrd, använder du alltid klammerparenteser {...} för att innehålla textblocket.
Uttryckskontrollblock
Ett uttryckskontrollblock utvärderar ett uttryck och konverterar det till en sträng. Detta infogas i utdatafilen.
Uttryckskontrollblock avgränsas av symbolerna <#= ... #>
Följande kontrollblock gör till exempel att utdatafilen innehåller "5":
<#= 2 + 3 #>
Observera att öppningssymbolen har tre tecken "<#=".
Uttrycket kan innehålla alla variabler som finns i omfånget. Det här blocket skriver till exempel ut rader med tal:
<#@ output extension=".txt" #>
<#
    for(int i = 0; i < 4; i++)
    {
#>
This is hello number <#= i+1 #>: Hello!
<#
    }
#>
Kontrollblock för klassfunktioner
Ett kontrollblock för klassfunktioner definierar egenskaper, metoder eller annan kod som inte ska ingå i huvudomformningen. Klassfunktionsblock används ofta för hjälpfunktioner. Vanligtvis placeras klassfunktionsblock i separata filer så att de kan ingå i mer än en textmall.
Kontrollblock för klassfunktioner avgränsas av symbolerna <#+ ... #>
Följande mallfil deklarerar och använder till exempel en metod:
<#@ 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;
}
#>
Klassfunktioner måste placeras i slutet av filen där de skrivs. Du kan dock <#@include#> en fil som innehåller en klassfunktionalitet, även om include-direktivet följs av standardblock och text.
Mer information om kontrollblock finns i Kontrollblock för textmallar.
Funktionsblock för klass kan innehålla textblock
Du kan skriva en metod som genererar text. Till exempel:
List of Squares:
<#
   for(int i = 0; i < 4; i++)
   {  WriteSquareLine(i); }
#>
End of list.
<#+   // Class feature block
private void WriteSquareLine(int i)
{
#>
   The square of <#= i #> is <#= i*i #>.
<#+
}
#>
Det är särskilt användbart att placera en metod som genererar text i en separat fil som kan ingå i mer än en mall.
Använda externa definitioner
Församlingar
Kodblocken i mallen kan använda typer som definieras i de mest använda .NET-assemblies, till exempel System.dll. Dessutom kan du referera till andra .NET-sammansättningar eller dina egna sammansättningar. Du kan ange ett sökvägsnamn eller det starka namnet på en sammansättning:
<#@ assembly name="System.Xml" #>
Du bör använda absoluta sökvägsnamn eller använda standardmakronamn i sökvägens namn. Till exempel:
<#@ assembly name="$(SolutionDir)library\MyAssembly.dll" #>
Sammansättningsdirektivet har ingen effekt i en förbearbetad textmall.
Mer information finns i T4-sammansättningsdirektivet.
Namnområden
Importdirektivet är detsamma som using -satsen i C# eller imports -satsen i Visual Basic. Det gör att du kan referera till typer i koden utan att använda ett fullständigt kvalificerat namn:
<#@ import namespace="System.Xml" #>
Du kan använda så många assembly och import direktiv som du vill. Du måste placera dem före text- och kontrollblock.
Mer information finns i T4-importdirektivet.
Inklusive kod och text
Direktivet include infogar text från en annan mallfil. Det här direktivet infogar till exempel innehållet i test.txt.
<#@ include file="c:\test.txt" #>
Det inkluderade innehållet bearbetas nästan som om det vore en del av den inkluderade textmallen. Du kan dock inkludera en fil som innehåller ett funktionsblock <#+...#> för klassen även om inkluderingsdirektivet följs av vanliga text- och standardkontrollblock.
Mer information finns i T4-inkluderingsdirektivet.
Hjälpmetoder
Det finns flera metoder, Write() till exempel som alltid är tillgängliga för dig i ett kontrollblock. De innehåller metoder för att hjälpa dig att dra in utdata och för att rapportera fel.
Du kan också skriva en egen uppsättning verktygsmetoder.
Mer information finns i Verktygsmetoder för textmallar.
Transformera data och modeller
Det mest användbara programmet för en textmall är att generera material baserat på innehållet i en källa, till exempel en modell, databas eller datafil. Mallen extraherar och formaterar om data. En samling mallar kan omvandla en sådan källa till flera filer.
Det finns flera sätt att läsa källfilen.
Läs en fil från textmallen. Det här är det enklaste sättet att hämta data till mallen:
<#@ import namespace="System.IO" #>
<# string fileContent = File.ReadAllText(@"C:\myData.txt"); ...
Läs in en fil som en navigeringsbar modell. En mer kraftfull metod är att läsa data som en modell, som textmallskoden kan navigera i. Du kan till exempel läsa in en XML-fil och navigera den med XPath-uttryck. Du kan också använda xsd.exe för att skapa en uppsättning klasser som du kan läsa XML-data med.
Redigera modellfilen i ett diagram eller formulär. Domain-Specific Language Tools innehåller verktyg som gör att du kan redigera en modell som ett diagram eller Ett Windows-formulär. Detta gör det enklare att diskutera modellen med användare av det genererade programmet. Domain-Specific Language Tools skapar också en uppsättning starkt skrivna klasser som återspeglar modellens struktur. Mer information finns i Generera kod från ett domänspecifikt språk.
Relativa filsökvägar i designläge-mallar
Om du i en textmall för designtid vill referera till en fil på en plats i förhållande till textmallen, använder du this.Host.ResolvePath(). Du måste också ange hostspecific="true" i template-direktivet:
<#@ template hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ import namespace="System.IO" #>
<#
 // Find a path within the same project as the text template:
 string myFile = File.ReadAllText(this.Host.ResolvePath("MyFile.txt"));
#>
Content of MyFile.txt is:
<#= myFile #>
Du kan också hämta andra tjänster som tillhandahålls av värden. Mer information finns i Komma åt Visual Studio eller andra värdar från en mall.
Designtidstextmallar körs i en separat AppDomain
Du bör vara medveten om att en textmall för designtid körs i en AppDomain som är separat från huvudprogrammet. I de flesta fall är detta inte viktigt, men du kan upptäcka begränsningar i vissa komplexa fall. Om du till exempel vill skicka data in eller ut från mallen från en separat tjänst måste tjänsten tillhandahålla ett serialiserbart API.
(Detta gäller inte för en körningstextmall som tillhandahåller kod som kompileras tillsammans med resten av koden.)
Redigera mallar
Specialiserade textmallsredigerare kan laddas ned från Extension Manager Online Gallery. På menyn Verktyg klickar du på Tilläggshanteraren. Klicka på Onlinegalleri och använd sedan sökverktyget.