Compartilhar via


T4 Métodos de utilitário do modelo de texto

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

Dica

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

Métodos de gravação.

Você pode usar o Write() e WriteLine() métodos para anexar o texto dentro de um bloco de código padrão, em vez de usar um bloco de código de expressão. Os blocos de código de dois seguintes 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 você ache útil usar um dos seguintes métodos de utilitário em vez de um bloco de expressão dentro de um bloco de código longo com estruturas de controle aninhado.

O Write() e WriteLine() métodos têm duas sobrecargas, que leva um parâmetro de seqüência de caracteres única e que leva uma seqüência de caracteres de formato composto além de uma matriz de objetos a serem incluídas na seqüência de caracteres (como o Console.WriteLine() método). Os seguintes dois usos do 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 os métodos de recuo para formatar a saída do seu modelo de texto. O TextTransformation classe tem um CurrentIndent propriedade string que mostra o recuo atual no modelo de texto e um indentLengths campo, ou seja, uma lista dos recuos que foram adicionados. Você pode adicionar um recuo com o PushIndent() método e subtrair um recuo com o PopIndent() método. Se você quiser remover todos os recuos, use o ClearIndent() método. O bloco de código a seguir 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");
#>

O bloco de código produz a seguinte saída:

Hello
        Hello
                Hello
Hello
        Hello

Erro e aviso

Você pode usar os métodos de utilitário de erro e aviso para adicionar mensagens para o Visual Studio erro de lista. Por exemplo, o código a seguir irá adicionar uma mensagem de erro para a lista de erros.

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

Acesso ao Host e o provedor de serviços

A propriedade this.Host pode fornecer acesso a propriedades expostas pelo host que está executando o modelo. Para usar this.Host, você deve definir hostspecific o atributo na <@template#> diretiva:

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

O tipo de this.Host depende do tipo de host no qual o modelo está em execução. Em um modelo que está sendo executado em Visual Studio, você pode converter os this.Host para 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 de utilitário

Como parte do processo de geração de texto, o seu arquivo de modelo é transformado em uma classe denominada GeneratedTextTransformation e herda de TextTransformation. Se você deseja usar um diferente conjunto de métodos em vez disso, poderá escrever sua própria classe e especificá-lo na diretriz de modelo. Sua classe deve herdar de TextTransformation.

<#@ template inherits="MyUtilityClass" #>

Use o assembly a diretiva para referenciar o assembly onde a classe compilada pode ser encontrada.