Direttiva parameter T4
In un modello di testo di Visual Studio la parameter
direttiva 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.
Uso della direttiva Parameter
<#@ parameter type="Full.TypeName" name="ParameterName" #>
La parameter
direttiva dichiara le proprietà nel codice modello inizializzate dai valori passati dal contesto esterno. È possibile impostare questi valori se si scrive codice che richiama la trasformazione del testo. I valori possono essere passati nel Session
dizionario o in CallContext.
È possibile dichiarare parametri di qualsiasi tipo remotabile. Ovvero, il tipo deve essere dichiarato con SerializableAttributeoppure deve derivare da MarshalByRefObject. In questo modo è possibile passare i valori dei parametri 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 a un modello
Se si scrive un'estensione di Visual Studio, ad esempio un comando di menu o un gestore eventi, è possibile elaborare un modello usando il servizio di creazione modelli 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 vengono passati valori usando 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 di runtime (pre-elaborato)
In genere non è necessario usare la <#@parameter#>
direttiva con modelli di testo di runtime (pre-elaborati). È invece possibile definire un costruttore aggiuntivo o una proprietà impostabile per il codice generato, tramite il quale si passano i valori dei parametri. Per altre informazioni, vedere Generazione di testo in fase di esecuzione con modelli di testo T4.
Tuttavia, se si vuole usare <#@parameter>
in un modello di runtime, è possibile passarvi valori usando il dizionario Sessione. Si supponga, ad esempio, di aver creato il file come modello pre-elaborato denominato PreTextTemplate1
. È possibile richiamare il modello nel programma usando 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();
Recupero di argomenti da TextTemplate.exe
Importante
La parameter
direttiva non recupera i valori impostati nel -a
parametro dell'utilità TextTransform.exe
. Per ottenere questi valori, impostare hostSpecific="true"
nella template
direttiva e usare this.Host.ResolveParameterValue("","","argName")
.