Condividi tramite


Metodi di utilità per i modelli di testo T4

Esistono diversi metodi sempre disponibili quando si scrive del codice in un modello di testo di Visual Studio. Questi metodi sono definiti in TextTransformation.

SuggerimentoSuggerimento

È inoltre possibile utilizzare altri metodi e servizi forniti dall'ambiente host in un modello di testo normale (non pre-elaborato). Ad esempio, è possibile risolvere percorsi di file, registrare errori e ottenere servizi forniti da Visual Studio e da qualsiasi pacchetto caricato. Per ulteriori informazioni, vedere Accesso a Visual Studio o altri host da un modello di testo T4.

Metodi Write

È possibile utilizzare i metodi Write() e WriteLine() per aggiungere testo in un blocco di codice standard, anziché utilizzare un blocco di codice dell'espressione. I due seguenti blocchi di codice sono equivalenti a livello funzionale:

Blocco di codice con un blocco di espressione

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

Blocco di codice che utilizza WriteLine()

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

È possibile utilizzare uno di questi metodi di utilità anziché un blocco di espressione all'interno di un blocco di codice lungo con strutture di controllo annidate.

I metodi Write() e WriteLine() dispongono di due overload, uno che prende un parametro stringa singolo e uno che prende una stringa di formato composto più una matrice di oggetti da includere nella stringa (come il metodo Console.WriteLine() ). I due seguenti utilizzi di WriteLine() sono equivalenti a livello funzionale:

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

Metodi di rientro

È possibile utilizzare metodi d rientro per formattare l'output del modello di testo. La classe TextTransformation dispone di una proprietà stringa CurrentIndent che mostra il rientro corrente nel modello di testo e di un campo indentLengths che è un elenco dei rientri aggiunti. È possibile aggiungere un rientro tramite il metodo PushIndent() e ridurre un rientro utilizzando il metodo PopIndent(). Se si desidera rimuovere tutti i rientri, utilizzare il metodo ClearIndent(). Nel blocco di codice riportato di seguito viene illustrato l'utilizzo di questi metodi:

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

Questo blocco di codice produce il seguente output:

Hello
        Hello
                Hello
Hello
        Hello

Metodi per errori e avvisi

È possibile utilizzare metodi di utilità per errori e avvisi per aggiungere dei messaggi all'Elenco errori di Visual Studio. Il codice riportato di seguito, ad esempio, aggiunge un messaggio di errore all'Elenco errori:

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

Accesso a host e a provider di servizi

La proprietà this.Host può fornire l'accesso a proprietà esposte dall'host che sta eseguendo il modello. Per utilizzare this.Host, è necessario impostare l'attributo hostspecific nella direttiva <@template#>:

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

Il tipo di this.Host dipende dal tipo di host nel quale il modello è in esecuzione. In un modello in esecuzione in Visual Studio, è possibile eseguire il cast di this.Host a IServiceProvider per accedere a servizi quali l'IDE. Ad esempio:

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

Utilizzo di un set diverso di metodi di utilità

Come parte del processo di generazione del testo, il file modello viene trasformato in una classe che è sempre denominata GeneratedTextTransformation e che eredita da TextTransformation. Se si desidera utilizzare un differente set di metodi, è possibile scrivere una propria classe e specificarla nella direttiva del modello. La classe deve ereditare da TextTransformation.

<#@ template inherits="MyUtilityClass" #>

Utilizzare la direttiva assembly per fare riferimento all'assembly che contiene la classe compilata.