T4 Diretriz de modelo
Inicia de um modelo de texto de Visual Studio T4 geralmente com uma política de template , que especifica como o modelo deve ser processado.Não deve haver mais de uma política de modelo em um modelo de texto e em quaisquer arquivos que inclua.
Para obter uma visão geral geral de modelos de texto de escrita, consulte Escrever um modelo de texto T4.
Usando a diretiva de modelo
<#@ template [language="VB"] [compilerOptions="options"] [culture="code"] [debug="true"] [hostspecific="true"] [inherits="templateBaseClass"] [visibility="internal"] [linePragmas="false"] #>
A política de template tem vários atributos que permitem que você especifique diferentes aspectos de transformação.todos os atributos são opcionais.
atributo de compilerOptions
exemplo:
compilerOptions="optimize+"valores válidos:
Algumas opções de compilador válidos.Para obter mais informações, consulte Opções do compilador C# listadas por categoria e Opções do compilador Visual Basic listadas por categoria.Ignorada para modelos de tempo de execução é preprocessada ().
Essas opções são aplicadas ao modelo foi convertido em Visual C# ou em Visual Basic, e o código resultante é criado.
atributo de cultura
exemplo:
culture="de-CH"valores válidos:
"", a cultura invariável, que é o padrão.Uma cultura expressa como uma cadeia de caracteres em xx-XX do formulário.Por exemplo, en-us. U., ja-jp, de- CH, de-de.Para obter mais informações, consulte System.Globalization.CultureInfo.
O atributo de cultura especifica a cultura a ser usada quando um bloco de expressão é convertido para texto.
atributo de depuração
exemplo:
debug="true"
valores válidos:
true, false.False é o padrão.
Se o atributo de debug é true, o arquivo intermediário de código conterá informações que permite que o depurador para identificar mais precisamente a posição no seu modelo onde uma interrupção ou uma exceção ocorreu.
Para modelos de tempo de design do arquivo intermediário de código será gravado no diretório %TEMP%.
Para executar um modelo em tempo de design no depurador, abra o menu de atalho do modelo de texto no solution Explorer, e escolha Modelo de depuração T4.
atributo hostspecific
exemplo:
hostspecific="true"
valores válidos:
true, false, trueFromBase.False é o padrão.
Se você definir o valor de esse atributo a true, uma propriedade chamada Host é adicionado à classe gerada pelo modelo de texto.A propriedade é uma referência ao host do mecanismo de transformação, e é declarada como Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost.Se você tiver definido um host personalizado, você pode convertê-lo para o tipo personalizado host.
Porque o tipo da propriedade depende do tipo de host, só é útil se você estiver escrevendo um modelo de texto que funciona somente com um host específico.
Quando hostspecific é true e você estiver usando Visual Studio, você pode converter this.Host a IServiceProvider para acessar recursos de Visual Studio .Você também pode usar Host.ResolvePath(filename) para obter o caminho absoluto de um arquivo no projeto.Por exemplo:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ output extension=".txt" #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="System.IO" #>
<# // Get the Visual Studio API as a service:
DTE dte = ((IServiceProvider)this.Host).GetCOMService(typeof(DTE)) as DTE;
#>
Number of projects in this solution: <#= dte.Solution.Projects.Count #>
<#
// Find a path within the current project:
string myFile = File.ReadAllText(this.Host.ResolvePath("MyFile.txt"));
#>
Content of myFile is:
<#= myFile #>
Se você usar atributos de inherits e de hostspecific juntos, especifique o host= " trueFromBase” na classe derivada e o host= " true” na classe base.Isso evita uma definição de propriedade de Host vezes no código gerado.
atributo de idioma
exemplo:
language="VB"valores válidos:
C# (padrão)VB
O atributo de idioma especifica o idioma (Visual Basic ou Visual C#) para usar o código-fonte em blocos de declaração e da expressão.O arquivo intermediário de código que a saída são geradas usará este idioma.Este idioma não está relacionado ao idioma que produz o modelo, que pode ser qualquer tipo de texto.
Por exemplo:
<#@ template language="VB" #>
<#@ output extension=".txt" #>
Squares of numbers:
<#
Dim number As Integer
For number = 1 To 4
#>
Square of <#= number #> is <#= number * number #>
<#
Next number
#>
o atributo inherits
Você pode especificar que o código de programa do modelo pode herdar de outra classe, que também pode ser gerado de um modelo de texto.
Herança em um modelo de texto em tempo de execução () é preprocessada
Você pode usar a herança entre modelos de texto em tempo de execução para criar um modelo básico que tem várias variantes derivados.Os modelos de tempo de execução são aqueles que têm a propriedade de Ferramenta Personalizada definida como TextTemplatingFilePreprocessor.Um modelo em tempo de execução gera código que você pode chamar em seu aplicativo cria o texto definido no modelo.Para obter mais informações, consulte Geração de texto de tempo de execução com modelos de texto T4.
Se você não especificar um atributo de inherits , uma classe base e uma classe derivada são geradas do modelo de texto.Quando você especificar um atributo de inherits , a classe derivada é gerada.Você pode escrever uma classe base manualmente, mas deve fornecer métodos que são usados pela classe derivada.
Mais geralmente, você especifica outro modelo é preprocessada como a classe base.O modelo de base fornece os blocos de texto comuns, que podem ser intercalados com texto derivados de modelos.Você pode usar blocos <#+ ... #> de recursos da classe para definir os métodos que contêm informações de texto.Por exemplo, você pode colocar a estrutura de texto de saída no modelo de base, fornecendo os métodos virtuais que podem ser substituídos em modelos derivados:
Modelo BaseTemplate.tt de texto em tempo de execução () é preprocessada:
This is the common header. <# SpecificFragment1(); #> A common central text. <# SpecificFragment2(); #> This is the common footer. <#+ // Declare abstract methods protected virtual void SpecificFragment1() { } protected virtual void SpecificFragment2() { } #>
Modelo DerivedTemplate1.tt de texto em tempo de execução () é preprocessada:
<#@ template language="C#" inherits="BaseTemplate" #> <# // Run the base template: base.TransformText(); #> <#+ // Provide fragments specific to this derived template: protected override void SpecificFragment1() { #> Fragment 1 for DerivedTemplate1 <#+ } protected override void SpecificFragment2() { #> Fragment 2 for DerivedTemplate1 <#+ } #>
Código do aplicativo para chamar DerivedTemplate1:
Console.WriteLine(new DerivedTemplate().TransformText());
Saída resultante:
This is the common header. Fragment 1 for DerivedTemplate1 A common central text. Fragment 2 for DerivedTemplate1 This is the common footer.
Você pode compilar a base e classes derivadas em projetos diferentes.Lembre-se adicionar o projeto ou o assembly base nas referências derivados do projeto.
Você também pode usar uma classe escrita à mão comum como a classe base.A classe base deve fornecer os métodos usados pela classe derivada.
Cuidado |
---|
Se você usar atributos de inherits e de hostspecific juntos, especifique o hostspecific= " trueFromBase” na classe derivada e em host= " verdadeiros” na classe base.Isso evita uma definição de propriedade de Host vezes no código gerado. |
Herança em um modelo em tempo de design de texto
Um modelo em tempo de design de texto é um arquivo que Ferramenta Personalizada é definido como TextTemplatingFileGenerator.O modelo gera um arquivo de saída de código ou de texto, que fazem parte do seu projeto de Visual Studio .Para gerar o arquivo de saída, o primeiro modelo é convertido em um arquivo intermediário de código de programa, que geralmente não consulte.O atributo de inherits especifica a classe base para esse código intermediária.
Para um modelo em tempo de design de texto, você pode especificar qualquer classe base que é derivada de Microsoft.VisualStudio.TextTemplating.TextTransformation.Use a diretiva de <#@assembly#> para carregar o assembly ou projeto que contém a classe base.
Para obter mais informações, consulte “Herança em modelos de texto” no blog de Gareth Jones.
atributo de LinePragmas
exemplo:
linePragmas="false"valores válidos:
true (padrão)false
Definindo o atributo como false remove as marcas que identificam números na sua linha do código gerado.Isso significa que o compilador relate todos os erros usando aos números de linha do código gerado. Isso oferece mais opções de depuração, como você pode escolher para depurar o modelo de texto ou o código gerado.
Esse atributo também pode ajudar se você estiver localizando os nomes de arquivo absolutos em pragmas está causando confundindo mesclagens sob controle de origem.
Atributo de visibilidade
exemplo:
visibility="internal"valores válidos:
public (padrão)internal
Em um modelo de texto em tempo de execução, isso define o atributo de visibilidade da classe gerada.Por padrão, a classe é parte de API pública do seu código, mas você pode definir visibility="internal" certificar-se de que apenas seu código pode usar a classe de geração.