2012-03-28 18 views
5

Sto cercando di utilizzare PGK.Extensions in un modello T4 in VS2008 per VB.NET e ottengo:Metodi di estensione in T4

RemoveAllSpecialCharacters non è un membro di corda ..

mio intestazioni T4:

<#@ template language="VB" hostspecific="false" debug="true" inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation" #> 
<#@ output extension="vb" #> 

<#@ assembly name="PGK.Extensions.dll" #> // the dll is found 
<#@ import namespace="StringExtensions" #> //Try with and without namespace 

Uso di estensione nel codice di blocco:

<# 
    Me.WriteLine(item.Name.RemoveAllSpecialCharacters.ToUpper) 
#> 

RemoveAllSpecialCharacters è un metodo di estensione stringa da PGK.Extensions.dll.

Qualcuno può aiutarmi?

MODIFICATO:

OK. È:

<#@ template language="VBv3.5" ... 

Ma questo interrompe l'intellisense di DevArt T4 Editor e l'evidenziazione della sintassi nel plugin VS2008. Utilizzare invece l'editor T4 tangibile.

risposta

1

Mentre un metodo di estensione viene visualizzato dal codice da applicare su un oggetto, in realtà viene compilato come metodo statico. Questo link da Microsoft ti fornirà maggiori informazioni su questo.

Quindi chiamando item.Name.RemoveAllSpecialCharacters() è infatti compilato come StringExtensions .RemoveAllSpecialCharacters (item.Name)

Pertanto, si potrebbe provare a scrivere (non testato, ma dovrebbe funzionare):

<# 
    StringExtensions.RemoveAllSpecialCharacters(item.Name).ToUpper() 
#> 

Spero che questo aiuti.

+0

sue opere, ma questo rompe il potere di metodi di estensione. Ho trovato questo link http://blogs.msdn.com/b/garethj/archive/2008/10/30/using-extension-methods-in-t4-templates.aspx e per l'autore funziona. Forse C# ma non VB? – jlvaquero

+0

Puoi sempre chiedere a MS di implementare correttamente i metodi di estensione nei modelli T4: D ... Ma ho paura fino ad allora non hai altra scelta. –

+0

E se si specifica la versione di VB.NET nella dichiarazione? Qualcosa come <# @ template language = "VBv9" debug = "true" #>, in sostituzione di v3.5 con il numero di versione più recente di VB (credo che 9 o 10 credo)? Funziona ? –

2

Ha avuto difficoltà a far funzionare tutto questo, anche con il post sul blog trovato here (indicato anche da @jlvaquero in un commento sopra).

ciò che alla fine ha funzionato per me è stato utilizzando il visual studio macro vars quindi importare lo spazio dei nomi

<#@ assembly name="$(ProjectDir)$(OutDir)\AssemblyName.dll" #> 
Problemi correlati