Partager via


Directive du paramètre T4

Dans un modèle de texte Visual Studio, la directive parameter déclare des propriétés dans votre code de modèle qui sont initialisées à partir de valeurs transmises à partir du contexte externe. Vous pouvez définir ces valeurs si vous écrivez du code qui appelle la transformation de texte.

Utilisation de la directive de paramètre

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

La directive parameter déclare des propriétés dans votre code de modèle qui sont initialisées à partir de valeurs passées à partir du contexte externe. Vous pouvez définir ces valeurs si vous écrivez du code qui appelle la transformation de texte. Les valeurs peuvent être passées dans le dictionnaire Session ou dans CallContext.

Vous pouvez déclarer des paramètres de n’importe quel type à distance. Autrement dit, le type doit être déclaré avec SerializableAttribute, ou il doit être dérivé de MarshalByRefObject. Cela permet aux valeurs de paramètre d’être passées dans l’AppDomain dans lequel le modèle est traité.

Par exemple, vous pouvez écrire un modèle de texte avec le contenu suivant :

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

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

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

Passage de valeurs de paramètre à un modèle

Si vous écrivez une extension Visual Studio telle qu’une commande de menu ou un gestionnaire d’événements, vous pouvez traiter un modèle à l’aide du service de création de modèles de texte :

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

Passage de valeurs dans le contexte d’appel

Vous pouvez également passer des valeurs en tant que données logiques dans CallContext.

L’exemple suivant transmet des valeurs à l’aide des deux méthodes :

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

Passage de valeurs à un modèle de texte d’exécution (prétraité)

Il n’est généralement pas nécessaire d’utiliser la directive <#@parameter#> avec des modèles de texte d’exécution (prétraités). Au lieu de cela, vous pouvez définir un constructeur supplémentaire ou une propriété définissable pour le code généré, par le biais duquel vous transmettez des valeurs de paramètre. Pour plus d’informations, consultez Génération de texte à l’exécution à l’aide des modèles de texte T4.

Toutefois, si vous souhaitez utiliser <#@parameter> dans un modèle d’exécution, vous pouvez lui transmettre des valeurs à l’aide du dictionnaire de session. Par exemple, supposons que vous avez créé le fichier en tant que modèle prétraité appelé PreTextTemplate1. Vous pouvez appeler le modèle dans votre programme à l’aide du code suivant.

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

Obtention d’arguments à partir de TextTemplate.exe

Important

La directive parameter ne récupère pas les valeurs définies dans le paramètre -a de l’utilitaire TextTransform.exe. Pour obtenir ces valeurs, définissez hostSpecific="true" dans la directive template et utilisez this.Host.ResolveParameterValue("","","argName").