Aracılığıyla paylaş


Metin Şablonu Denetim Blokları

Denetim blokları, çıktıyı değiştirmek için metin şablonunuzda kod yazmanızı sağlar. Açma köşeli ayraçlarıyla ayırt edilen üç tür denetim bloğu vardır:

  • <# Standard control blocks #> deyimleri içerebilir.

  • <#= Expression control blocks #> ifadeler içerebilir.

  • <#+ Class feature control blocks #> yöntemler, alanlar ve özellikler içerebilir.

Standart denetim bloğu

Standart denetim blokları deyimleri içerir. Örneğin, aşağıdaki standart blok XML belgesindeki tüm özniteliklerin adlarını alır:

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

veya forgibi if bir bileşik deyimin içine düz metin ekleyebilirsiniz. Örneğin, bu parça her döngü yinelemesinde bir çıkış satırı oluşturur:

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

Uyarı

Katıştırılmış düz metin içeren iç içe yerleştirilmiş deyimleri sınırlandırmak için her zaman {...} kullanın. Aşağıdaki örnek düzgün çalışmayabilir:

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

Bunun yerine, aşağıdaki gibi {küme ayracı} eklemeniz gerekir:


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

İfade denetim bloğu

İfade denetim blokları, çıkış dosyasına yazılacak dizeler sağlayan kod için kullanılır. Örneğin, yukarıdaki örnekle, kod bloğunu aşağıdaki gibi değiştirerek özniteliklerin adlarını çıkış dosyasına yazdırabilirsiniz:

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

Sınıf özelliği denetim bloğu

Metin şablonunuza yöntemler, özellikler, alanlar ve hatta iç içe sınıflar eklemek için sınıf özellik denetim bloklarını kullanabilirsiniz. Sınıf özellik bloklarının en yaygın kullanımı, metin şablonunun diğer bölümlerinde kod için yardımcı işlevler sağlamaktır. Örneğin, aşağıdaki sınıf özellik bloğu öznitelik adının ilk harfini büyük harfe çevirir (veya ad boşluk içeriyorsa, her sözcüğün ilk harfini büyük harfe çevirir):

<#@ import namespace="System.Globalization" #>
<#+
    private string FixAttributeName(string name)
    {
        return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(name);
    }
#>

Not

Sınıf özellik denetim bloğunun ardından aynı şablon dosyasındaki standart denetim blokları olmamalıdır. Ancak bu kısıtlama, kullanım <#@include#> yönergelerinin sonucu için geçerli değildir. Eklenen her dosyada standart bloklar ve ardından sınıf özellik blokları bulunabilir.

Bir sınıf özelliği denetim bloğunun içine metin ve ifade blokları ekleyerek çıkış oluşturan bir işlev oluşturabilirsiniz. Örneğin:

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

Bu işlevi standart bir bloktan veya başka bir sınıf özellik bloğundan çağırabilirsiniz:

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

Denetim bloklarını kullanma

Tek bir şablondaki tüm standart ve ifade denetim bloklarındaki tüm kodlar (dahil edilen şablonlardaki tüm kodlar dahil) oluşturulan kodun yöntemini oluşturmak TransformText() için birleştirilir. (Yönergesine include diğer metin şablonlarını ekleme hakkında daha fazla bilgi için bkz. T4 Metin Şablonu Yönergeleri.)

Denetim bloklarını kullanırken aşağıdaki noktaları göz önünde bulundurmanız gerekir:

  • Dil. Metin şablonunda C# veya Visual Basic kodu kullanabilirsiniz. Varsayılan dil C#'tir, ancak Visual Basic'i yönergesinin language template parametresiyle belirtebilirsiniz. (Yönerge hakkında template daha fazla bilgi için bkz . T4 Metin Şablonu Yönergeleri.)

    Denetim bloklarında kullandığınız dilin, metin şablonunda oluşturduğunuz metnin dili veya biçimiyle hiçbir ilgisi yoktur. Visual Basic kodunu kullanarak veya tersiyle C# oluşturabilirsiniz.

    Yönergesine eklediğiniz include tüm metin şablonları dahil olmak üzere belirli bir metin şablonunda yalnızca bir dil kullanabilirsiniz.

  • Yerel değişkenler. Bir metin şablonundaki standart ve ifade denetim bloklarındaki tüm kod tek bir yöntem olarak oluşturulduğundan, yerel değişkenlerin adlarıyla çakışma olmadığından emin olmanız gerekir. Diğer metin şablonlarını da dahil ediyorsanız, değişken adlarının tüm dahil edilen şablonlar arasında benzersiz olduğundan emin olmanız gerekir. Bunu sağlamanın bir yolu, bildirildiği metin şablonunu tanımlayan her yerel değişken adına bir dize eklemektir.

    Ayrıca, özellikle birden çok metin şablonu eklerken, bunları bildirirken yerel değişkenlerinizi mantıklı değerlere başlatmak da iyi bir fikirdir.

  • Denetim bloklarının iç içe yerleştirmesi. Denetim blokları iç içe yerleştirilmeyebilir. Başka bir denetim bloğu açmadan önce her zaman belirli bir denetim bloğunu sonlandırmanız gerekir. Örneğin, aşağıda standart denetim bloğunun parçası olarak ifade bloğundaki bazı metinlerin nasıl yazdırılacağını gösterilmektedir.

    <#
    int x = 10;
    while (x-- > 0)
    {
    #>
    <#= x #>
    <# } #>
    
  • Refactoring. Metin şablonlarınızı kısa ve kolay anlaşılır tutmak için, yeniden kullanılabilir kodu sınıf özellik bloklarındaki yardımcı işlevlere ekleyerek veya Microsoft.VisualStudio.TextTemplating.TextTransformation sınıfından devralan kendi metin şablonu sınıfınızı oluşturarak yinelenen kodlardan kaçınmanız kesinlikle önerilir.