Директива Parameter T4
В текстовом шаблоне parameter
Visual Studio директива объявляет свойства в коде шаблона, который инициализирован из значений, передаваемых из внешнего контекста. Эти значения можно задать при написании кода, вызывающего преобразование текста.
Использование директивы параметров
<#@ parameter type="Full.TypeName" name="ParameterName" #>
Директива parameter
объявляет свойства в коде шаблона, которые инициализированы из значений, передаваемых из внешнего контекста. Эти значения можно задать при написании кода, вызывающего преобразование текста. Значения можно передать в Session
словаре или в CallContext.
Вы можете объявить параметры любого remotable типа. То есть тип должен быть объявлен с SerializableAttribute, или он должен быть производным от MarshalByRefObject. Это позволяет передавать значения параметров в домен appDomain, в котором обрабатывается шаблон.
Например, можно написать текстовый шаблон со следующим содержимым:
<#@ template language="C#" #>
<#@ parameter type="System.Int32" name="TimesToRepeat" #>
<# for (int i = 0; i < TimesToRepeat; i++) { #>
Line <#= i #>
<# } #>
Передача значений параметров шаблону
Если вы пишете расширение Visual Studio, например команду меню или обработчик событий, можно обработать шаблон с помощью службы шаблонов текста:
// 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"));
Передача значений в контексте вызова
Можно также передать значения в CallContextвиде логических данных.
В следующем примере значения передаются с помощью обоих методов:
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
Передача значений в текстовый шаблон времени выполнения (предварительная обработка)
Обычно не требуется использовать директиву <#@parameter#>
с текстовыми шаблонами времени выполнения (предварительно обработанной). Вместо этого можно определить дополнительный конструктор или свойство settable для созданного кода, через который передаются значения параметров. Дополнительные сведения см. в статье Создание текста во время выполнения с помощью текстовых шаблонов T4.
Однако если вы хотите использовать <#@parameter>
в шаблоне времени выполнения, вы можете передать в него значения с помощью словаря сеансов. Предположим, что вы создали файл как предварительно обработанный шаблон PreTextTemplate1
. Вы можете вызвать шаблон в программе с помощью следующего кода.
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();
Получение аргументов из TextTemplate.exe
Важно!
Директива parameter
не извлекает значения, заданные -a
в параметре TextTransform.exe
служебной программы. Чтобы получить эти значения, задайте hostSpecific="true"
в директиве template
и используйте this.Host.ResolveParameterValue("","","argName")
.