Share via


Directiva de parámetro T4

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

Uso de la directiva parameter

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

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

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

Por ejemplo, podría escribir 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 va a escribir una extensión de Visual Studio, como un comando de menú o un controlador de eventos, puede procesar una plantilla mediante 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

También puede pasar valores como datos lógicos en CallContext.

En el ejemplo siguiente se pasan valores mediante 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 de texto en tiempo de ejecución (preprocesada)

Normalmente, no es necesario usar la directiva <#@parameter#> con plantillas de texto en tiempo de ejecución (preprocesadas). En su lugar, puede definir un constructor adicional o una propiedad configurable para el código generado, a través del cual se pasan los 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 usar <#@parameter> en una plantilla en tiempo de ejecución, puede pasarle valores mediante el diccionario Session. Por ejemplo, supongamos que ha creado el archivo como una plantilla preprocesada denominada PreTextTemplate1. Puede invocar la plantilla en el programa mediante el código siguiente.

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

Obtención de argumentos de TextTemplate.exe

Importante

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