Condividi tramite


Direttiva parameter T4

In un modello di testo di Visual Studio, la direttiva parameter dichiara le proprietà nel codice del modello inizializzate dai valori passati dal contesto esterno. È possibile impostare questi valori se si scrive codice che richiama la trasformazione del testo.

Utilizzo della direttiva Parameter

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

La direttiva parameter dichiara le proprietà nel codice del modello inizializzate dai valori passati dal contesto esterno. È possibile impostare questi valori se si scrive codice che richiama la trasformazione del testo. È possibile passare i valori nel dizionario Session o in CallContext.

È possibile dichiarare i parametri di qualsiasi tipo utilizzabile in remoto. In altri termini, è necessario dichiarare il tipo con SerializableAttribute oppure deve derivare da MarshalByRefObject. In questo modo i valori dei parametri vengano passati nell'AppDomain in cui viene elaborato il modello.

Ad esempio, è possibile scrivere un modello di testo con il contenuto seguente:

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

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

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

Passaggio dei valori dei parametri in un modello

Se si scrive un'estensione di Visual Studio, quale un comando di menu o un gestore eventi, è possibile elaborare un modello tramite il servizio del modello di testo:

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

Passaggio di valori nel contesto di chiamata

In alternativa, è possibile passare valori come dati logici in CallContext.

Nell'esempio seguente i valori vengono passati utilizzando entrambi i metodi:

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

Passaggio di valori a un modello di testo (pre-elaborato) della fase di esecuzione

Non è di solito necessario utilizzare la direttiva <#@parameter#> con i modelli di testo (pre-elaborati) della fase di esecuzione. Al contrario, è possibile definire un costruttore aggiuntivo o una proprietà impostabile per il codice generato tramite il quale vengono passati i valori dei parametri. Per ulteriori informazioni, vedere Generazione di testo in fase di esecuzione con modelli di testo T4.

Tuttavia, se si desidera utilizzare <#@parameter> in un modello della fase di esecuzione, è possibile passare i valori a tale modello tramite il dizionario Session. Si supponga ad esempio di avere creato il file come modello pre-elaborato denominato PreTextTemplate1. È possibile richiamare il modello nel programma tramite il codice seguente.

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

Acquisizione di argomenti da TextTemplate.exe

Importante

La direttiva parameter non recupera valori impostati nel parametro –a dell'utilità TextTransform.exe.Per ottenere tali valori, impostare hostSpecific="true" nella direttiva template e utilizzare this.Host.ResolveParameterValue("","","argName").