Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Med kontrollblock kan du skriva kod i textmallen för att variera utdata. Det finns tre typer av kontrollblock som särskiljs av deras inledande hakparenteser:
<# Standard control blocks #>kan innehålla instruktioner.<#= Expression control blocks #>kan innehålla uttryck.<#+ Class feature control blocks #>kan innehålla metoder, fält och egenskaper.
Standardkontrollblock
Standardkontrollblock innehåller instruktioner. Följande standardblock hämtar till exempel namnen på alla attribut i XML-dokumentet:
<#@ assembly name="System.Xml.dll" #>
<#@ import namespace="System.Xml" #>
<#
List<string> allAttributes = new List<string>();
XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"E:\CSharp\Overview.xml");
XmlAttributeCollection attributes = xDoc.Attributes;
if (attributes.Count > 0)
{
foreach (XmlAttribute attr in attributes)
{
allAtributes.Add(attr.Name);
}
}
#>
Du kan bädda in oformaterad text i en sammansatt instruktion, till exempel if eller for. Det här fragmentet genererar till exempel en utdatarad i varje loop-iteration:
<#
foreach (XmlAttribute attr in attributes)
{
#>
Found another one!
<#
allAtributes.Add(attr.Name);
}
#>
Varning
Använd alltid {...} för att avgränsa kapslade instruktioner som innehåller inbäddad oformaterad text. Följande exempel kanske inte fungerar korrekt:
<# if (ShouldPrint) #> Some text. -- WRONG
I stället bör du inkludera {braces}, enligt följande:
<#
if (ShouldPrint)
{ // "{" REQUIRED
#>
Some text.
<#
}
#>
Kontrollblock för uttryck
Uttryckskontrollblock används för kod som innehåller strängar som ska skrivas till utdatafilen. Med exemplet ovan kan du till exempel skriva ut namnen på attributen till utdatafilen genom att ändra kodblocket på följande sätt:
<#
XmlDocument xDoc = new XmlDocument();
xDoc.Load(@"E:\CSharp\Overview.xml");
XmlAttributeCollection attributes = xDoc.Attributes;
if (attributes != null)
{
foreach (XmlAttribute attr in attributes)
{
#><#= attr.Name #><#
}
}
#>
Kontrollblock för klassfunktioner
Du kan använda funktionskontrollblock för klassen för att lägga till metoder, egenskaper, fält eller till och med kapslade klasser i textmallen. Den vanligaste användningen av klassfunktionsblock är att tillhandahålla hjälpfunktioner för kod i andra delar av textmallen. Till exempel gör följande klassblock den första bokstaven i attributnamnet stor (eller, om namnet innehåller blanksteg, gör det den första bokstaven i varje ord stor):
<#@ import namespace="System.Globalization" #>
<#+
private string FixAttributeName(string name)
{
return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(name);
}
#>
Anmärkning
Ett kontrollblock för klassfunktioner får inte följas av standardkontrollblock i samma mallfil. Denna begränsning gäller dock inte för resultatet av <#@include#>-direktivens användning. Varje inkluderad fil kan ha standardblock följt av klassfunktionsblock.
Du kan skapa en funktion som genererar utdata genom att bädda in text- och uttrycksblock i ett kontrollblock för klassfunktioner. Till exempel:
<#+
private void OutputFixedAttributeName(string name)
{
#>
Attribute: <#= CultureInfo.CurrentCulture.TextInfo.ToTitleCase(name) #>
<#+ // <<< Notice that this is also a class feature block.
}
#>
Du kan anropa den här funktionen från ett standardblock eller från ett annat funktionsblock för klassen:
<# foreach (Attribute attribute in item.Attributes)
{
OutputFixedAttributeName(attribute.Name);
}
#>
Så här använder du kontrollblock
All kod i alla standard- och uttryckskontrollblock i en enda mall (inklusive all kod i inkluderade mallar) kombineras för att bilda metoden för den TransformText() genererade koden. (Mer information om hur du inkluderar andra textmallar med direktivet finns i includeT4-direktiv för textmallar.)
Tänk på följande när du använder kontrollblock:
Språk. Du kan använda C# eller Visual Basic-kod i en textmall. Standardspråket är C#, men du kan ange Visual Basic med parametern
languageförtemplatedirektivet. (Mer information om direktivet finns itemplateT4-direktiv för textmallar.)Det språk som du använder i kontrollblock har inget att göra med språket eller formatet för texten som du genererar i en textmall. Du kan generera C# med hjälp av Visual Basic-kod eller vice versa.
Du kan bara använda ett språk i en viss textmall, inklusive alla textmallar som du tar med i
includedirektivet.Lokala variabler. Eftersom all kod i standard- och uttryckskontrollblocken i en textmall genereras som en enda metod bör du se till att det inte finns några konflikter med namnen på lokala variabler. Om du inkluderar andra textmallar måste du se till att variabelnamnen är unika för alla inkluderade mallar. Ett sätt att se till att detta är att lägga till en sträng i varje lokalt variabelnamn som identifierar textmallen där den deklarerades.
Det är också en bra idé att initiera dina lokala variabler till förnuftiga värden när du deklarerar dem, särskilt när du inkluderar flera textmallar.
Kapsling av kontrollblock. Kontrollblock får inte kapslas in i varandra. Du måste alltid avsluta ett visst kontrollblock innan du öppnar ett annat. Följande visar till exempel hur du skriver ut text i ett uttrycksblock som en del av ett standardkontrollblock.
<# int x = 10; while (x-- > 0) { #> <#= x #> <# } #>Omstrukturera. För att hålla textmallarna korta och lättförståeliga rekommenderar vi starkt att du undviker upprepad kod, antingen genom att räkna in den återanvändbara koden i hjälpfunktioner i funktionsblock för klassen eller genom att skapa en egen textmallsklass som ärver från klassen Microsoft.VisualStudio.TextTemplating.TextTransformation.