Metodi di utilità per i modelli di testo
Quando si scrive codice in un modello di testo di Visual Studio, sono sempre disponibili diversi metodi. Questi metodi sono definiti in TextTransformation.
Suggerimento
È anche possibile usare altri metodi e servizi forniti dall'ambiente host in un modello di testo normale (non pre-elaborato). Ad esempio, è possibile risolvere i percorsi dei file, registrare gli errori e ottenere i servizi forniti da Visual Studio ed eventuali pacchetti caricati. Per altre informazioni, vedere Accesso a Visual Studio da un modello di testo.
Scrivere metodi
È possibile usare i Write()
metodi e WriteLine()
per accodare testo all'interno di un blocco di codice standard, anziché usare un blocco di codice di espressione. I due blocchi di codice seguenti sono equivalenti a livello funzionale.
Blocco di codice con un blocco di espressioni
<#
int i = 10;
while (i-- > 0)
{ #>
<#= i #>
<# }
#>
Blocco di codice con WriteLine()
<#
int i = 10;
while (i-- > 0)
{
WriteLine((i.ToString()));
}
#>
Può risultare utile usare uno di questi metodi di utilità anziché un blocco di espressioni all'interno di un blocco di codice lungo con strutture di controllo annidate.
I Write()
metodi e WriteLine()
hanno due overload, uno che accetta un singolo parametro stringa e uno che accetta una stringa di formato composito più una matrice di oggetti da includere nella stringa (ad esempio il Console.WriteLine()
metodo ). I due usi seguenti 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 usare i metodi di rientro per formattare l'output del modello di testo. La TextTransformation classe ha una CurrentIndent
proprietà stringa che mostra il rientro corrente nel modello di testo e un indentLengths
campo che rappresenta un elenco dei rientri aggiunti. È possibile aggiungere un rientro con il PushIndent()
metodo e sottrarre un rientro con il PopIndent()
metodo . Se si desidera rimuovere tutti i rientri, usare il ClearIndent()
metodo . Il blocco di codice seguente illustra l'uso 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 l'output seguente:
Hello
Hello
Hello
Hello
Hello
Metodi di errore e avviso
È possibile usare metodi di utilità di errore e avviso per aggiungere messaggi all'elenco errori di Visual Studio. Ad esempio, il codice seguente aggiungerà 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 provider di servizi
La proprietà this.Host
può fornire l'accesso alle proprietà esposte dall'host che esegue il modello. Per usare this.Host
, è necessario impostare hostspecific
l'attributo <@template#>
nella direttiva :
<#@template ... hostspecific="true" #>
Il tipo di this.Host
dipende dal tipo di host in cui viene eseguito il modello. In un modello in esecuzione in Visual Studio, è possibile eseguire il cast this.Host
per IServiceProvider
ottenere l'accesso ai servizi, ad esempio l'IDE. Ad esempio:
EnvDTE.DTE dte = (EnvDTE.DTE) ((IServiceProvider) this.Host)
.GetService(typeof(EnvDTE.DTE));
Uso 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 viene sempre denominata GeneratedTextTransformation
ed eredita da TextTransformation. Se invece si vuole usare un set diverso di metodi, è possibile scrivere la propria classe e specificarla nella direttiva modello. La classe deve ereditare da TextTransformation.
<#@ template inherits="MyUtilityClass" #>
Usare la assembly
direttiva per fare riferimento all'assembly in cui è possibile trovare la classe compilata.