Generowanie tekstu Run-Time z szablonami tekst T4
Można wygenerować ciągi tekstowe w aplikacji w czasie wykonywania za pomocą Visual Studio runtime tekst szablonów.Komputer, gdy aplikacja wykonuje nie muszą mieć Visual Studio.Szablony Runtime są czasami nazywane "preprocessed szablonów tekstu", ponieważ w czasie kompilacji szablonu generuje kod, który jest wykonywany w czasie wykonywania.
Każdy szablon jest mieszaniną tekst pojawią się w ciągu wygenerowany i fragmentów kodu programu.Fragmenty program podać wartości dla zmiennej części ciągu i również kontrolować warunkowego i powtarzające się części.
Na przykład następujący szablon można w aplikacji, która tworzy raport w formacie HTML.
<#@ template language="C#" #>
<html><body>
<h1>Sales for Previous Month</h2>
<table>
<# for (int i = 1; i <= 10; i++)
{ #>
<tr><td>Test name <#= i #> </td>
<td>Test value <#= i * i #> </td> </tr>
<# } #>
</table>
This report is Company Confidential.
</body></html>
Należy zauważyć, że szablon jest strona HTML, w którym zostało zastąpionych zmiennej części kodu programu.Projekt strony sieci można rozpocząć pisząc prototyp statyczne strony HTML.Następnie można zastąpić w tabeli i inne części zmiennej z kodu programu, który generuje zawartość, która różni się od jednej okazji do następnego.
Za pomocą szablonu w sieci powoduje, że aplikacja jest widoczność ostatecznej postaci danych wyjściowych, niż można na przykład długiego szeregu instrukcji zapisu w.Wprowadzanie zmian w postaci danych wyjściowych jest prostsze i bardziej niezawodne.
Tworzenie szablonu tekst Run-Time w dowolnej aplikacji
Aby utworzyć szablon tekst w czasie wykonywania
W oknie Solution Explorer projektu, w menu skrótów wybierz polecenie Dodaj, Nowego elementu.
W Dodaj nowy element okno dialogowe Wybierz Runtime tekst szablonu.(W Visual Basic pod Wspólne Items\General.)
Wpisz nazwę dla pliku szablonu.
[!UWAGA]
Nazwa pliku szablonu będzie używany jako nazwa klasy w generowanym kodzie.Dlatego nie powinien spacje lub znaki interpunkcyjne.
Wybierz dodać.
Tworzony jest nowy plik, który ma rozszerzenie .tt.Jego Niestandardowego narzędzia właściwość jest ustawiona na TextTemplatingFilePreprocessor.Zawiera on następujące wiersze:
<#@ template language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System.Linq" #> <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #>
Konwersja istniejącego pliku szablonu czasu
Dobrym sposobem tworzenia szablonu jest Konwertowanie istniejących przykład danych wyjściowych.Na przykład jeśli aplikacja wygeneruje pliki HTML, można uruchomić przez utworzenie zwykłego pliku HTML.Upewnij się, że działa poprawnie i czy jego wygląd jest poprawna.Następnie dołączyć go do użytkownika Visual Studio projektu i przekonwertować go do szablonu.
Aby przekonwertować szablon czasu istniejącego pliku tekstowego
Dołączyć plik do programu Visual Studio projektu.W oknie Solution Explorer projektu, w menu skrótów wybierz polecenie Dodaj, Istniejącego elementu.
Ustawianie pliku Narzędzia niestandardowe właściwość, aby TextTemplatingFilePreprocessor.W oknie Solution Explorer pliku, w menu skrótów wybierz polecenie Właściwości.
[!UWAGA]
Jeśli właściwość jest już ustawiona, upewnij się, że jest TextTemplatingFilePreprocessor i nie TextTemplatingFileGenerator.Może się to zdarzyć, jeśli zawiera plik, który już ma rozszerzenie .tt.
Zmień rozszerzenie nazwy pliku do .tt.Mimo, że ten krok jest opcjonalny, umożliwia unikanie otwierania pliku w edytorze niepoprawne.
Usuń wszystkie spacje lub znaki interpunkcyjne z główną częścią nazwy pliku.Na przykład "My Web Page.tt" jest niepoprawny, ale "MyWebPage.tt" jest poprawna.Nazwa pliku będzie używany jako nazwa klasy w generowanym kodzie.
Wstaw następujący wiersz na początku pliku.Jeśli pracujesz w projekcie języka Visual Basic, zastąpić "C#" z "VB".
<#@ template language="C#" #>
Zawartość szablonu czasu
Dyrektywy szablonu
Pierwszy wiersz szablonu należy pamiętać, jak w chwili tworzenia pliku:
<#@ template language="C#" #>
Parametr język zależy od języka projektu.
Zwykły zawartości
Edytowanie .tt plik zawiera tekst, który chcesz wygenerować aplikacji.Na przykład:
<html><body>
<h1>Sales for January</h2>
<!-- table to be inserted here -->
This report is Company Confidential.
</body></html>
Osadzony kod programów
Można wstawić kod programu między <# i #>.Na przykład:
<table>
<# for (int i = 1; i <= 10; i++)
{ #>
<tr><td>Test name <#= i #> </td>
<td>Test value <#= i * i #> </td> </tr>
<# } #>
</table>
<table>
<#
For i As Integer = 1 To 10
#>
<tr><td>Test name <#= i #> </td>
<td>Test value <#= i*i #> </td></tr>
<#
Next
#>
</table>
Należy zauważyć, że sprawozdania są wstawiane między <# ... #> i wyrażeń są wstawiane między <#= ... #>.Aby uzyskać więcej informacji, zobacz Zapisywanie szablonu tekst T4.
Za pomocą szablonu
Kod, który z szablonu
Gdy zapiszesz .tt plików, jednostka zależna .cs lub .vb zostanie utworzony plik.Aby wyświetlić ten plik w oknie Solution Explorer, rozwiń węzeł .tt węzeł pliku.W projekcie programu Visual Basic będzie można rozwinąć węzeł po kliknięciu Pokaż wszystkie pliki w panelu Solution Explorer.
Ogłoszenia, że ten plik pomocniczych zawiera częściowej klasy, która zawiera metodę o nazwie TransformText().Tę metodę można wywołać z aplikacji.
Generowanie tekstu w czasie wykonywania
W kodzie aplikacji można wygenerować zawartość szablonu przy użyciu wywołania tak:
MyWebPage page = new MyWebPage();
String pageContent = page.TransformText();
System.IO.File.WriteAllText("outputPage.html", pageContent);
Dim page = New My.Templates.MyWebPage
Dim pageContent = page.TransformText()
System.IO.File.WriteAllText("outputPage.html", pageContent)
Aby umieścić wygenerowanej klasy, w szczególności nazw, należy ustawić Nazw narzędzia niestandardowe właściwości szablonu pliku tekstowego.
Debugowanie szablony Runtime tekstu
Debugowanie i testowanie szablonów tekst runtime w taki sam sposób jak zwykłe kodu.
Punkt przerwania można ustawić w szablonie tekstu.Po uruchomieniu aplikacji w trybie debugowania z programu Visual Studio można kodu i ocenia wyrażenia czujki w zwykły sposób.
Przekazywanie parametrów w Konstruktorze
Zwykle szablon należy zaimportować dane z innych części aplikacji.Aby to łatwe, kod, który w szablonie jest częściowe klasy.W projekcie można utworzyć inną częścią tej samej klasy w innym pliku.Ten plik może zawierać konstruktora z parametrami, właściwości i funkcje, które można zarówno kod, który jest osadzony w szablonie i pozostałej części aplikacji.
Na przykład można utworzyć osobny plik MyWebPageCode.cs:
partial class MyWebPage
{
private MyData m_data;
public MyWebPage(MyData data) { this.m_data = data; }}
W pliku szablonu MyWebPage.tt, można napisać:
<h2>Sales figures</h2>
<table>
<# foreach (MyDataItem item in m_data.Items)
// m_data is declared in MyWebPageCode.cs
{ #>
<tr><td> <#= item.Name #> </td>
<td> <#= item.Value #> </td></tr>
<# } // end of foreach
#>
</table>
Aby użyć tego szablonu w aplikacji:
MyData data = ...;
MyWebPage page = new MyWebPage(data);
String pageContent = page.TransformText();
System.IO.File.WriteAllText("outputPage.html", pageContent);
Parametry Konstruktora w języku Visual Basic
W Visual Basic, oddzielny plik MyWebPageCode.vb zawiera:
Namespace My.Templates
Partial Public Class MyWebPage
Private m_data As MyData
Public Sub New(ByVal data As MyData)
m_data = data
End Sub
End Class
End Namespace
Plik szablonu może zawierać:
<#@ template language="VB" #>
<html><body>
<h1>Sales for January</h2>
<table>
<#
For Each item In m_data.Items
#>
<tr><td>Test name <#= item.Name #> </td>
<td>Test value <#= item.Value #> </td></tr>
<#
Next
#>
</table>
This report is Company Confidential.
</body></html>
I szablon będzie wywoływany przez przekazanie parametru w konstruktorze:
Dim data = New My.Templates.MyData
' Add data values here ....
Dim page = New My.Templates.MyWebPage(data)
Dim pageContent = page.TransformText()
System.IO.File.WriteAllText("outputPage.html", pageContent)
Przekazywanie danych we właściwościach szablonu
Alternatywną metodą przekazywania danych do szablonu jest dodanie właściwości publiczne do szablonu klasy w definicji klasy częściowe.Aplikacja może ustawić właściwości przed wywołaniem TransformText().
Można również dodawać pola do szablonu klasy w definicji częściowej.To mogłoby umożliwiają przekazywanie danych pomiędzy kolejnymi egzekucji szablonu.
Użyj klasy częściowe dla kodu
Wielu programistów wolą uniknąć pisania dużej jednostki kodu w szablonach.Zamiast tego należy zdefiniować metody w częściowej klasy, która ma taką samą nazwę jak plik szablonu.Wywołania tych metod z szablonu.W ten sposób szablon przedstawia bardziej wyraźnie jakie docelowych ciąg wyjściowy będzie wyglądać.Dyskusje na temat wyglądu wyniku mogą być oddzielone od logiki tworzenia wyświetla dane.
Zespoły i odwołania
Jeśli chcesz odwołać kodu szablonu.NET lub innego zestawu, takich jak System.Xml.dll, należy go dodać do swojego projektu odniesienia w zwykły sposób.
Jeśli chcesz zaimportować obszar nazw w taki sam sposób jak using instrukcji, można to zrobić z import dyrektywę:
<#@ import namespace="System.Xml" #>
Dyrektywy te muszą być umieszczone na początku pliku, niezwłocznie po <#@template dyrektywy.
Zawartość udostępniona
Jeśli tekst, który jest współużytkowane przez kilka szablonów, można umieścić w oddzielnym pliku i dołączyć każdy plik, w którym powinien pojawić się:
<#@include file="CommonHeader.txt" #>
Dołączona zawartość może zawierać jakiejkolwiek mieszanki kodu programu i zwykłego tekstu i może zawierać inne dyrektyw oraz innych dyrektyw.
Dyrektywy dołączania może używana w dowolnym miejscu w tekście pliku szablonu lub pliku dołączanego.
Dziedziczenie między szablonami tekst Run-Time
Można udostępniać zawartość między szablony czasu pisząc szablonu klasy podstawowej, które mogą być abstrakcyjne.Użyj inherits parametr <@#template#> dyrektywy, aby odwołać się za innym runtime szablonu klasy.
Deseń dziedziczenia: fragmenty w metodach Base
W strukturze w przykładzie, który następuje zawiadomienie następujące punkty:
Klasa podstawowa SharedFragments definiuje metody w blokach funkcja klasy <#+ ... #>.
Klasa bazowa nie zawiera swobodnego tekstu.Zamiast tego wszystkie bloki tekstu występują wewnątrz metody klasy funkcji.
Klasa pochodna wywołuje metody, określone w SharedFragments.
Wywołania aplikacji TextTransform() metody odziedziczonej klasy, ale nie Przekształć klasy bazowej SharedFragments.
Klasy podstawowej i pochodnych są szablony tekst runtime: oznacza to, że Niestandardowego narzędzia właściwość jest ustawiona na TextTemplatingFilePreprocessor.
SharedFragments.tt:
<#@ template language="C#" #>
<#+
protected void SharedText(int n)
{
#>
Shared Text <#= n #>
<#+
}
// Insert more methods here if required.
#>
MyTextTemplate1.tt:
<#@ template language="C#" inherits="SharedFragments" #>
begin 1
<# SharedText(2); #>
end 1
MyProgram.cs:
...
MyTextTemplate1 t1 = new MyTextTemplate1();
string result = t1.TransformText();
Console.WriteLine(result);
Dane wyjściowe:
begin 1
Shared Text 2
end 1
Deseń dziedziczenia: Tekst w podstawowej treści
W to alternatywne podejście przy użyciu szablonu dziedziczenia część tekstu jest zdefiniowany w szablonu bazowego.Pochodne szablony udostępniają dane i fragmentów tekstu, który mieści się w podstawowej zawartości.
AbstractBaseTemplate1.tt:
<#@ template language="C#" #>
Here is the description for this derived template:
<#= this.Description #>
Here is the fragment specific to this derived template:
<#
this.PushIndent(" ");
SpecificFragment(42);
this.PopIndent();
#>
End of common template.
<#+
// State set by derived class before calling TextTransform:
protected string Description = "";
// 'abstract' method to be defined in derived classes:
protected virtual void SpecificFragment(int n) { }
#>
DerivedTemplate1.tt:
<#@ template language="C#" inherits="AbstractBaseTemplate1" #>
<#
// Set the base template properties:
base.Description = "Description for this derived class";
// Run the base template:
base.TransformText();
#>
End material for DerivedTemplate1.
<#+
// Provide a fragment specific to this derived template:
protected override void SpecificFragment(int n)
{
#>
Specific to DerivedTemplate1 : <#= n #>
<#+
}
#>
Kod aplikacji:
...
DerivedTemplate1 t1 = new DerivedTemplate1();
string result = t1.TransformText();
Console.WriteLine(result);
Dane wyjściowe:
Here is the description for this derived template:
Description for this derived class
Here is the fragment specific to this derived template:
Specific to DerivedTemplate1 : 42
End of common template.
End material for DerivedTemplate1.
Tematy pokrewne
Szablony czasu projektu: Jeśli chcesz użyć szablonu do generowania kodu, częścią aplikacji, zobacz Generowanie kodu czasu projektowania przy użyciu szablonów tekst T4.
Szablony w czasie wykonywania można w dowolnej aplikacji gdzie szablonów i ich zawartości są określane w czasie kompilacji.Ale jeśli chcesz zapisać Visual Studio rozszerzenia, które generuje tekst z szablonów, które zmiany w czasie wykonywania, zobacz Wywoływanie przekształcenie tekstu w rozszerzeniu VS.
Zobacz też
Koncepcje
Kod generacji i szablony tekst T4
Inne zasoby
Zrozumienie T4: Preprocessed szablonów tekstu przez Oleg Sych