Compartilhar via


Métodos de utilitário do modelo de texto

Há vários métodos que sempre estão disponíveis quando você escreve código em um modelo de texto do Visual Studio. Esses métodos são definidos em TextTransformation.

Dica

Você também pode usar outros métodos e serviços fornecidos pelo ambiente de host em um modelo de texto regular (não pré-processado). Por exemplo, você pode resolver caminhos de arquivo, erros de log e obter serviços fornecidos pelo Visual Studio e por qualquer pacote carregado. Para obter mais informações, consulte Acessando o Visual Studio de um modelo de texto.

Métodos de gravação

Você pode usar os métodos Write() e WriteLine() para acrescentar texto dentro de um bloco de código padrão em vez de usar um bloco de código de expressão. Os dois blocos de código a seguir são funcionalmente equivalentes.

Bloco de código com um bloco de expressão

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

Bloco de código usando WriteLine()

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

Talvez seja útil usar um desses métodos utilitários em vez de um bloco de expressão dentro de um bloco de código longo com estruturas de controle aninhadas.

Os métodos Write() e WriteLine() têm duas sobrecargas, uma que usa um parâmetro de cadeia de caracteres e outra que usa uma cadeia de caracteres de formato composto mais uma matriz de objetos a serem incluídos na cadeia de caracteres (como o método Console.WriteLine()). Os dois seguintes usos de WriteLine() são funcionalmente equivalentes:

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

Métodos de recuo

Você pode usar métodos de recuo para formatar a saída do modelo de texto. A classe TextTransformation tem uma propriedade de cadeia de caracteres CurrentIndent que mostra o recuo atual no modelo de texto e um campo indentLengths que é uma lista dos recuos que foram adicionados. Você pode adicionar um recuo com o método PushIndent() e subtrair um recuo com o método PopIndent(). Se quiser remover todos os recuos, use o método ClearIndent(). O seguinte bloco de código mostra o uso desses métodos:

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

Este bloco de código gera a seguinte saída:

Hello
        Hello
                Hello
Hello
        Hello

Marcas de erro e aviso

Você pode usar métodos de utilitário de erro e aviso para adicionar mensagens à Lista de Erros do Visual Studio. Por exemplo, o código a seguir adicionará uma mensagem de erro à Lista de Erros.

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

Acesso ao host e ao provedor de serviços

A propriedade this.Host pode fornecer acesso às propriedades expostas pelo host que está executando o modelo. Para usar this.Host, defina o atributo hostspecific na diretiva <@template#>:

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

O tipo de this.Host depende do tipo de host no qual o modelo está sendo executado. Em um modelo em execução no Visual Studio, você pode converter this.Host em IServiceProvider para obter acesso a serviços como o IDE. Por exemplo:

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

Usando um conjunto diferente de métodos utilitários

Como parte do processo de geração de texto, o arquivo de modelo é transformado em uma classe, que sempre é nomeada GeneratedTextTransformation e herda de TextTransformation. Se você quiser usar um conjunto de métodos diferente, poderá escrever sua classe e especificá-la na diretiva de modelo. Sua classe precisa herdar de TextTransformation.

<#@ template inherits="MyUtilityClass" #>

Use a diretiva assembly para fazer referência ao assembly em que a classe compilada pode ser encontrada.