Diretiva de parâmetro T4
Em um modelo de texto do Visual Studio, a diretiva parameter
declara propriedades em seu código de modelo que são inicializadas a partir de valores passados do contexto externo. Você poderá definir esses valores se gravar o código que invoque a transformação de texto.
Usando a diretiva de parâmetro
<#@ parameter type="Full.TypeName" name="ParameterName" #>
A diretiva parameter
declara propriedades em seu código de modelo que são inicializadas a partir de valores passados do contexto externo. Você poderá definir esses valores se gravar o código que invoque a transformação de texto. Os valores podem ser passados no dicionário Session
ou no CallContext.
Você pode declarar parâmetros de qualquer tipo remoto. Isto é, o tipo deve ser declarado com SerializableAttribute ou deve ser derivado de MarshalByRefObject. Isso permite que os valores de parâmetro sejam passados para o AppDomain no qual o modelo é processado.
Por exemplo, você pode gravar um modelo de texto com o seguinte conteúdo:
<#@ template language="C#" #>
<#@ parameter type="System.Int32" name="TimesToRepeat" #>
<# for (int i = 0; i < TimesToRepeat; i++) { #>
Line <#= i #>
<# } #>
Passando valores de parâmetro para um modelo
Se você estiver escrevendo uma Extensão do Visual Studio, como um comando de menu ou um manipulador de eventos, poderá processar um modelo usando o serviço de modelagem de texto:
// 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"));
Passando valores no contexto de chamada
Como alternativa, você pode passar valores como dados lógicos no CallContext.
O exemplo a seguir passa valores usando ambos os métodos:
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
Passando valores para um modelo de texto em tempo de execução (pré-processado)
Normalmente, não é necessário usar a diretiva <#@parameter#>
com modelos de texto em tempo de execução (pré-processados). Em vez disso, você pode definir um construtor adicional ou uma propriedade configurável para o código gerado, por meio do qual você passa valores de parâmetro. Para obter mais informações, confira Geração de texto em tempo de execução com modelos de texto T4.
No entanto, se você quiser usar <#@parameter>
em um modelo de tempo de execução, poderá passar valores para ele usando o dicionário Sessão. Por exemplo, suponha que você tenha criado o arquivo como um modelo pré-processado chamado PreTextTemplate1
. Você pode invocar o modelo em seu programa usando o código a seguir.
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();
Obtendo argumentos a partir de TextTemplate.exe
Importante
A diretiva parameter
não recupera valores definidos no parâmetro -a
do utilitário TextTransform.exe
. Para obter esses valores, defina hostSpecific="true"
na diretiva template
e use this.Host.ResolveParameterValue("","","argName")
.