Udostępnij za pośrednictwem


Bloki kontrolne szablonu tekstu

Bloki kontrolne umożliwiają pisanie kodu szablonu tekstu do różnią się w danych wyjściowych.Istnieją trzy rodzaje bloki kontrolne, które są wyróżnione nawiasami ich otwarcia:

  • <# Standard control blocks #>może zawierać instrukcje.

  • <#= Expression control blocks #>może zawierać wyrażenia.

  • <#+ Class feature control blocks #>może zawierać metody, pola i właściwości.

Blok kontrolny standardowy

Bloki kontrolne standardowe zawierają instrukcje.Na przykład następujący standardowy blok pobiera nazwy wszystkich atrybutów w dokumencie XML:

<#@ 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);
       }
     }  
#>

Można osadzić zwykłego tekstu wewnątrz instrukcji mieszanek, takich jak if lub for.Na przykład ten fragment generuje wiersza danych wyjściowych w każdej iteracji pętli:

<#
       foreach (XmlAttribute attr in attributes)
       {
#>
Found another one!
<#
           allAtributes.Add(attr.Name);
       }
#>
Informacje dotyczące przestrogiPrzestroga

{...} Należy zawsze używać do ograniczania zagnieżdżonych instrukcji, które zawierają osadzone zwykły tekst.Poniższy przykład może nie działać prawidłowo:

<# if (ShouldPrint) #> Some text. -- WRONG

Zamiast tego należy dołączyć {nawiasów klamrowych}, w następujący sposób:

 
<#
 if (ShouldPrint)
 {   //  "{" REQUIRED
#>
Some text.
<#
 } 
#>

Blok kontrolny wyrażenie

Bloki kontrolne wyrażenie są używane dla kodu, który zawiera ciągi do zapisania pliku wyjściowego.Na przykład w powyższym przykładzie można wydrukować nazw atrybutów w pliku wyjściowym, modyfikując blok kodu w następujący sposób:

<#
    XmlDocument xDoc = new XmlDocument();
    xDoc.Load(@"E:\CSharp\Overview.xml");
    XmlAttributeCollection attributes = xDoc.Attributes;
    if (attributes != null)
    {
       foreach (XmlAttribute attr in attributes)
       { 
#>
        <#= attr.Name #>
<#
       }
    }
#>

Blok sterowania funkcją klasy

Aby dodać do szablonu tekst metod, właściwości, pól lub nawet zagnieżdżonych klas, można użyć bloków sterowania funkcją klasy.Najbardziej powszechne zastosowanie klasy funkcja bloków jest zapewnienie funkcji pomocnika dla kodu w innych częściach szablonu tekstu.Na przykład następujący blok funkcja klasy powoduje rozpoczynanie wielką pierwszej litery nazwy atrybutu (lub, jeśli nazwa zawiera odstępy, zamienia dużą pierwszą literę każdego wyrazu):

<#@ import namespace="System.Globalization" #>

<#+
    private string FixAttributeName(string name)
    {
        return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(name);
    }
#>

[!UWAGA]

Blok sterowania funkcją klasy nie musi następować bloki kontrolne standard w tym samym pliku szablonu.Jednakże ograniczenie to nie dotyczą wynik za pomocą <#@include#> dyrektyw.Każdy plik dołączony może mieć standardowe bloki następuje bloki funkcja klasy.

Można utworzyć funkcję, która generuje dane wyjściowe osadzając bloki tekstu i wyrażenie wewnątrz bloku sterowania funkcją klasy.Na przykład:

<#+
    private string OutputFixedAttributeName(string name)
    {
#>
 Attribute:  <#= CultureInfo.CurrentCulture.TextInfo.ToTitleCase(name) #>
<#+  // <<< Notice that this is also a class feature block.
    }
#>

Ta funkcja może wywołać standardowy blok lub inny blok funkcja klasy:

<# foreach (Attribute attribute in item.Attributes)
{
  OutputFixedAttributeName(attribute.Name);
}
#>

Jak używać bloki kontrolne

Cały kod we wszystkich bloków sterowania standard i wyrażenia w jednego szablonu (w tym cały kod w szablony dołączone) jest połączone do formularza TransformText() metoda wygenerowany kod.(Aby uzyskać więcej informacji o tym inne szablony tekst z include w dyrektywie, zobacz T4 Tekst szablonu dyrektyw.)

Użytkownik należy mieć na uwadze następujące zagadnienia dotyczące korzystania z bloków sterowania:

  • Język. W szablonie tekstu, można użyć albo C# lub kodu języka Visual Basic.Jest domyślny język C#, ale można określić języka Visual Basic z language parametr template dyrektywy.(Aby uzyskać więcej informacji o template w dyrektywie, zobacz T4 Tekst szablonu dyrektyw.)

    Język używany w bloki kontrolne ma nic wspólnego z języka lub formatu tekstu, który generowanie szablonu tekstu.Można wygenerować C# za pomocą programu Visual Basic kodu lub na odwrót.

    Można użyć tylko jednego języka w szablonie danego tekstu, w tym szablony tekst obejmują z include dyrektywy.

  • Zmienne lokalne. Ponieważ cały kod kontroli standard i wyrażenie bloki w szablonie tekst zostanie wygenerowany jako pojedynczą metodę, powinny należy upewnić się, że nie występują żadne konflikty z nazwami zmiennych lokalnych.Jeśli łącznie z innych szablonów tekstu, musi upewnij się, że nazwy zmiennych są unikatowe we wszystkich szablonach.Jednym ze sposobów zapewnienia tego jest dodać ciąg znaków w nazwach zmiennych lokalnych identyfikującej szablon tekstu, w którym została zadeklarowana.

    To jest również zainicjować zmienne lokalne sensowny wartości przy deklarowaniu je, szczególnie w przypadku, gdy łącznie z wielu szablonów tekstu.

  • Zagnieżdżanie bloków kontrolnych. Bloki kontrolne nie może być zagnieżdżone wewnątrz sobie nawzajem.Zawsze musi zakończyć bloku danego formantu, przed otwarciem innym.Na przykład poniżej przedstawiono sposób drukowania część tekstu w bloku wyrażenia jako część bloku kontroli standardowego.

    <# 
    int x = 10;
    while (x-- > 0)
    {
    #>
    <#= x #>
    <# } #>
    
  • Przeróbek. Aby zachować swoje szablony tekst krótkie i łatwe do zrozumienia, stanowczo zaleca się uniknąć powtarzających się kodu, przez factoring wielokrotnego użytku kod w funkcji pomocnika w blokach funkcja klasy lub tworząc własne klasy szablonu tekstu, która dziedziczy z klasy Microsoft.VisualStudio.TextTemplating.TextTransformation.