Sdílet prostřednictvím


T4 – direktiva Parameter

V textové šabloně sady parameter Visual Studio deklaruje direktiva vlastnosti v kódu šablony inicializované z hodnot předaných z externího kontextu. Tyto hodnoty můžete nastavit, pokud napíšete kód, který vyvolá transformaci textu.

Použití direktivy parametru

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

Direktiva parameter deklaruje vlastnosti v kódu šablony, které jsou inicializovány z hodnot předaných z externího kontextu. Tyto hodnoty můžete nastavit, pokud napíšete kód, který vyvolá transformaci textu. Hodnoty lze předat buď ve slovníku Session , nebo v CallContext.

Můžete deklarovat parametry libovolného typu vzdálené komunikace. To znamená, že typ musí být deklarován s SerializableAttribute, nebo musí být odvozen z MarshalByRefObject. To umožňuje předání hodnot parametrů do AppDomain, ve kterém je šablona zpracována.

Můžete například napsat textovou šablonu s následujícím obsahem:

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

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

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

Předání hodnot parametrů do šablony

Pokud píšete rozšíření sady Visual Studio, například příkaz nabídky nebo obslužnou rutinu události, můžete šablonu zpracovat pomocí služby šablon textu:

// 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"));

Předávání hodnot v kontextu volání

Alternativně můžete předat hodnoty jako logická data v CallContext.

Následující příklad předává hodnoty pomocí obou 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

Předání hodnot textové šabloně runtime (předzpracované)

Obvykle není nutné používat direktivu <#@parameter#> s textovými šablonami za běhu (předzpracovanými). Místo toho můžete definovat další konstruktor nebo vlastnost settable pro vygenerovaný kód, prostřednictvím kterého předáváte hodnoty parametrů. Další informace najdete v tématu Generování textu za běhu pomocí textových šablon T4.

Pokud ale chcete použít <#@parameter> šablonu za běhu, můžete do ní předat hodnoty pomocí slovníku Relace. Předpokládejme například, že jste soubor vytvořili jako předzpracovanou šablonu s názvem PreTextTemplate1. Šablonu v programu můžete vyvolat pomocí následujícího kódu.

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();

Získání argumentů z TextTemplate.exe

Důležité

Direktiva parameter nenačítá hodnoty nastavené v -a parametru TextTransform.exe nástroje. Chcete-li tyto hodnoty získat, nastavte hostSpecific="true" v direktivě template a použijte this.Host.ResolveParameterValue("","","argName").