Compartir a través de


Directiva de parámetro T4

En una plantilla de texto de Visual Studio, la directiva parameter declara propiedades en el código de plantilla que se inicializan a partir de los valores pasados desde el contexto externo.Puede establecer estos valores si escribe el código que invocará a la transformación de texto.

Usar la directiva de parámetro

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

La directiva parameter declara propiedades en el código de plantilla que se inicializan a partir de los valores pasados desde el contexto externo.Puede establecer estos valores si escribe el código que invocará a la transformación de texto.Los valores se pueden pasar en el diccionario Session o en CallContext.

Puede declarar parámetros de cualquier tipo remoto.Es decir, el tipo se debe declarar con SerializableAttribute o se debe derivar desde MarshalByRefObject.Esto permite pasar valores de parámetro en el AppDomain en el que se procesa la plantilla.

Por ejemplo, podría escribir a una plantilla de texto con el siguiente contenido:

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

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

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

Pasar valores de parámetro a una plantilla

Si está escribiendo una extensión de Visual Studio como un comando de menú o un controlador de eventos, puede procesar una plantilla utilizando el servicio de plantillas 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"));

Pasar valores en el contexto de llamada

Alternativamente, puede pasar valores como datos lógicos en CallContext.

En el siguiente ejemplo se pasan valores utilizando ambos 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

Pasar valores a una plantilla texto (preprocesada) en tiempo de ejecución

Por lo general, no es necesario utilizar la directiva <#@parameter#> con plantillas de texto (preprocesadas) en tiempo de ejecución.En su lugar, puede definir un constructor adicional o una propiedad configurable para el código generado, a través del cual se pasan valores de parámetro.Para obtener más información, vea Generación de texto en tiempo de ejecución con plantillas de texto T4.

Sin embargo, si desea utilizar <#@parameter> en una plantilla en tiempo de ejecución, puede pasar los valores a la plantilla utilizando el Diccionario de la sesión.Por ejemplo, suponga que ha creado el archivo como una plantilla preprocesada denominada PreTextTemplate1.Puede invocar a la plantilla en su programa mediante el siguiente código.

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

Obtener argumentos a partir de TextTemplate.exe

Nota importanteImportante

La directiva parameter no recupera el conjunto de valores en el parámetro –a de la utilidad TextTransform.exe.Para obtener esos valores, establezca hostSpecific="true" en la directiva template y utilice this.Host.ResolveParameterValue("","","argName").