Поделиться через


Служебные методы для текстовых шаблонов

Существует несколько методов, которые всегда доступны при написании кода в текстовом шаблоне Visual Studio. Эти методы определены в TextTransformation.

Совет

Вы также можете использовать другие методы и службы, предоставляемые средой узла, в обычном (не предварительно обработанном) текстовом шаблоне. Например, можно разрешать пути к файлам, ошибки журнала и получать службы, предоставляемые Visual Studio и любыми загруженными пакетами. Дополнительные сведения см. в разделе "Доступ к Visual Studio" из текстового шаблона.

Методы записи

Вы можете использовать Write() методы и WriteLine() методы для добавления текста в стандартный блок кода, а не с помощью блока кода выражения. Следующие два блока кода функционально эквивалентны.

Блок кода с блоком выражений

<#
int i = 10;
while (i-- > 0)
    { #>
        <#= i #>
    <# }
#>

Блок кода с помощью WriteLine()

<#
    int i = 10;
    while (i-- > 0)
    {
        WriteLine((i.ToString()));
    }
#>

Возможно, вам будет полезно использовать один из этих методов служебной программы вместо блока выражений внутри длинного блока кода со вложенными структурами управления.

Методы Write() имеют две перегрузки, одна из которых принимает один строковый параметр и один, который принимает составную строку форматирования, а также массив объектов для включения в строку (напримерConsole.WriteLine(), WriteLine() метод). Следующие два использования WriteLine() функционально эквивалентны:

<#
    string msg = "Say: {0}, {1}, {2}";
    string s1 = "hello";
    string s2 = "goodbye";
    string s3 = "farewell";

    WriteLine(msg, s1, s2, s3);
    WriteLine("Say: hello, goodbye, farewell");
#>

Методы отступа

Методы отступа можно использовать для форматирования выходных данных текстового шаблона. Класс TextTransformation имеет CurrentIndent строковое свойство, отображающее текущее отступ в текстовом шаблоне и indentLengths поле, которое является списком добавленных отступов. Вы можете добавить отступ с PushIndent() помощью метода и вычитать отступ с PopIndent() помощью метода. Если вы хотите удалить все отступы, используйте ClearIndent() этот метод. В следующем блоке кода показано использование этих методов:

<#
    WriteLine(CurrentIndent + "Hello");
    PushIndent("    ");
    WriteLine(CurrentIndent + "Hello");
    PushIndent("    ");
    WriteLine(CurrentIndent + "Hello");
    ClearIndent();
    WriteLine(CurrentIndent + "Hello");
    PushIndent("    ");
    WriteLine(CurrentIndent + "Hello");
#>

Этот блок кода создает следующие выходные данные:

Hello
        Hello
                Hello
Hello
        Hello

Методы ошибки и предупреждения

Для добавления сообщений в список ошибок Visual Studio можно использовать методы ошибки и предупреждения. Например, следующий код добавит сообщение об ошибке в список ошибок.

<#
  try
  {
    string str = null;
    Write(str.Length.ToString());
  }
  catch (Exception e)
  {
    Error(e.Message);
  }
#>

Доступ к поставщику узлов и служб

Свойство this.Host может предоставить доступ к свойствам, предоставляемым узлом, выполняющим шаблон. Чтобы использовать this.Host, необходимо задать hostspecific атрибут в директиве <@template#> :

<#@template ... hostspecific="true" #>

Тип this.Host зависит от типа узла, в котором выполняется шаблон. В шаблоне, работающем в Visual Studio, можно привести this.HostIServiceProvider к доступу к службам, таким как интегрированная среда разработки. Например:

EnvDTE.DTE dte = (EnvDTE.DTE) ((IServiceProvider) this.Host)
                       .GetService(typeof(EnvDTE.DTE));

Использование другого набора служебных методов

В процессе создания текста файл шаблона преобразуется в класс, который всегда называется GeneratedTextTransformationи наследуется.TextTransformation Если вы хотите использовать другой набор методов, можно написать собственный класс и указать его в директиве шаблона. Класс должен наследоваться от TextTransformation.

<#@ template inherits="MyUtilityClass" #>

assembly Используйте директиву для ссылки на сборку, в которой можно найти скомпилированный класс.