Udostępnij za pośrednictwem


Dyrektywa T4 dotycząca parametru

W szablonie parameter tekstowym programu Visual Studio dyrektywa deklaruje właściwości w kodzie szablonu, które są inicjowane z wartości przekazywanych z kontekstu zewnętrznego. Te wartości można ustawić, jeśli napiszesz kod, który wywołuje przekształcenie tekstu.

Korzystanie z dyrektywy parametru

<#@ parameter type="Full.TypeName" name="ParameterName" #>

Dyrektywa parameter deklaruje właściwości w kodzie szablonu, które są inicjowane z wartości przekazywanych z kontekstu zewnętrznego. Te wartości można ustawić, jeśli napiszesz kod, który wywołuje przekształcenie tekstu. Wartości można przekazać w słowniku Session lub w CallContextpliku .

Można zadeklarować parametry dowolnego typu komunikacji zdalnie. Oznacza to, że typ musi być zadeklarowany za pomocą SerializableAttribute, lub musi pochodzić z MarshalByRefObject. Dzięki temu wartości parametrów mogą być przekazywane do domeny aplikacji, w której jest przetwarzany szablon.

Na przykład możesz napisać szablon tekstowy z następującą zawartością:

<#@ template language="C#" #>

<#@ parameter type="System.Int32" name="TimesToRepeat" #>

<# for (int i = 0; i < TimesToRepeat; i++) { #>
Line <#= i #>
<# } #>

Przekazywanie wartości parametrów do szablonu

Jeśli piszesz rozszerzenie programu Visual Studio, takie jak polecenie menu lub program obsługi zdarzeń, możesz przetworzyć szablon przy użyciu usługi tworzenia szablonów tekstowych:

// Get a service provider - how you do this depends on the context:
IServiceProvider serviceProvider = dte; // or dslDiagram.Store, for example
// Get the text template service:
ITextTemplating t4 = serviceProvider.GetService(typeof(STextTemplating)) as ITextTemplating;
ITextTemplatingSessionHost host = t4 as ITextTemplatingSessionHost;
// Create a Session in which to pass parameters:
host.Session = host.CreateSession();
// Add parameter values to the Session:
session["TimesToRepeat"] = 5;
// Process a text template:
string result = t4.ProcessTemplate("MyTemplateFile.t4",
  System.IO.File.ReadAllText("MyTemplateFile.t4"));

Przekazywanie wartości w kontekście wywołania

Możesz również przekazywać wartości jako dane logiczne w pliku CallContext.

Poniższy przykład przekazuje wartości przy użyciu obu metod:

ITextTemplating t4 = this.Store.GetService(typeof(STextTemplating)) as ITextTemplating;
ITextTemplatingSessionHost host = t4 as ITextTemplatingSessionHost;
host.Session = host.CreateSession();
// Pass a value in Session:
host.Session["p1"] = 32;
// Pass another value in CallContext:
System.Runtime.Remoting.Messaging.CallContext.LogicalSetData("p2", "test");

// Process a small template inline:
string result = t4.ProcessTemplate("",
   "<#@parameter type=\"System.Int32\" name=\"p1\"#>"
 + "<#@parameter type=\"System.String\" name=\"p2\"#>"
 + "Test <#=p1#> <#=p2#>");

// Result value is:
//     Test 32 test

Przekazywanie wartości do szablonu tekstu w czasie wykonywania (wstępnie przetworzonym)

Zwykle nie jest konieczne użycie <#@parameter#> dyrektywy z szablonami tekstowymi w czasie wykonywania (wstępnie przetworzonymi). Zamiast tego można zdefiniować dodatkowy konstruktor lub właściwość settable dla wygenerowanego kodu, za pomocą którego przekazujesz wartości parametrów. Aby uzyskać więcej informacji, zobacz Generowanie tekstu w czasie wykonywania przy użyciu szablonów tekstu T4.

Jeśli jednak chcesz użyć <#@parameter> w szablonie czasu wykonywania, możesz przekazać do niego wartości przy użyciu słownika sesji. Załóżmy na przykład, że plik został utworzony jako wstępnie przetworzony szablon o nazwie PreTextTemplate1. Szablon w programie można wywołać przy użyciu następującego kodu.

PreTextTemplate1 t = new PreTextTemplate1();
t.Session = new Microsoft.VisualStudio.TextTemplating.TextTemplatingSession();
t.Session["TimesToRepeat"] = 5;
// Add other parameter values to t.Session here.
t.Initialize(); // Must call this to transfer values.
string resultText = t.TransformText();

Uzyskiwanie argumentów z pliku TextTemplate.exe

Ważne

Dyrektywa parameter nie pobiera wartości ustawionych w -a parametrze TextTransform.exe narzędzia. Aby uzyskać te wartości, ustaw hostSpecific="true" w template dyrektywie i użyj polecenia this.Host.ResolveParameterValue("","","argName").