Teilen über


T4-Parameter-Direktive

In einer Visual Studio-Textvorlage deklariert die parameter-Anweisung Eigenschaften in Ihrem Vorlagencode, die aus Werten initialisiert werden, die aus dem externen Kontext übergeben wurden. Sie können diese Werte festlegen, wenn Sie Code schreiben, der die Texttransformation aufruft.

Verwenden der Parameter-Anweisung

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

Die parameter-Anweisung in Visual Studio deklariert Eigenschaften in Ihrem Vorlagencode, die aus Werten initialisiert werden, die aus dem externen Kontext übergeben werden. Sie können diese Werte festlegen, wenn Sie Code schreiben, der die Texttransformation aufruft. Die Werte können entweder im Session-Wörterbuch oder in CallContextübergeben werden.

Sie können Parameter eines beliebigen remotefähigen Typs deklarieren. Das heißt, der Typ muss mit SerializableAttribute deklariert werden, oder er muss von MarshalByRefObject abgeleitet sein. Dadurch können Parameterwerte an die AppDomain übergeben werden, in der die Vorlage verarbeitet wird.

Sie könnten beispielsweise eine Textvorlage mit dem folgenden Inhalt schreiben:

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

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

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

Übergeben von Parameterwerten an eine Vorlage

Wenn Sie eine Visual Studio-Erweiterung wie einen Menübefehl oder einen Ereignishandler schreiben, können Sie eine Vorlage mithilfe des Textvorlagendiensts verarbeiten:

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

Übergeben von Werten in den Aufrufkontext

Alternativ können Sie Werte als logische Daten in CallContext übergeben.

Im folgenden Beispiel werden Werte mit beiden Methoden übergeben:

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

Übergeben von Werten an eine Laufzeittextvorlage (vorverarbeitete Textvorlage)

In der Regel ist es nicht erforderlich, die <#@parameter#>-Anweisung mit Laufzeittextvorlagen (vorverarbeiteten Textvorlagen) zu verwenden. Stattdessen können Sie einen zusätzlichen Konstruktor oder eine festlegbare Eigenschaft für den generierten Code definieren, über den bzw. die Sie Parameterwerte übergeben. Weitere Informationen finden Sie unter Laufzeittextgenerierung mithilfe von T4-Textvorlagen.

Wenn Sie jedoch <#@parameter> in einer Laufzeitvorlage verwenden möchten, können Sie Werte mithilfe des Sitzungswörterbuchs übergeben. Angenommen, Sie haben die Datei als vorverarbeitete Vorlage mit dem Namen PreTextTemplate1 erstellt. Sie können die Vorlage in Ihrem Programm aufrufen, indem Sie den folgenden Code verwenden.

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

Abrufen von Argumenten aus „TextTemplate.exe“

Wichtig

Die parameter-Anweisung ruft keine Werte ab, die im -a-Parameter des Hilfsprogramms TextTransform.exe festgelegt sind. Um diese Werte abzurufen, legen Sie hostSpecific="true" in der template-Anweisung fest, und verwenden Sie this.Host.ResolveParameterValue("","","argName").