2012-03-28 1 views
5

J'essaie d'utiliser PGK.Extensions dans un modèle T4 dans VS2008 pour VB.NET et je reçois:Méthodes d'extension à T4

RemoveAllSpecialCharacters est pas membre de la chaîne ..

Mon têtes de 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 

L'utilisation de l'extension dans le code de bloc:

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

RemoveAllSpecialCharacters est une méthode d'extension de chaîne à partir de PGK.Extensions.dll.

Quelqu'un peut-il m'aider?

EDITED:

OK. C'est:

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

Mais cela casse DevArt T4 Editor IntelliSense et la coloration syntaxique dans le plugin VS2008. Utilisez plutôt l'éditeur Tangible T4.

Répondre

1

Alors qu'une méthode d'extension apparaît à partir du code à appliquer sur un objet, elle est en fait compilée en tant que méthode statique. Ce link de Microsoft vous donnera plus d'informations à ce sujet.

Donc, appeler item.Name.RemoveAllSpecialCharacters() est en fait compilé comme StringExtensions .RemoveAllSpecialCharacters (item.name)

Par conséquent, vous pouvez essayer d'écrire (non testé, mais devrait fonctionner):

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

Espérons que ça aide.

+0

Ses œuvres, mais cette brise la puissance des méthodes d'extension. J'ai trouvé ce lien http://blogs.msdn.com/b/garethj/archive/2008/10/30/using-extension-methods-in-t4-templates.aspx et pour l'auteur fonctionne. Peut-être que C# mais pas VB? – jlvaquero

+0

Vous pouvez toujours demander à MS d'implémenter correctement les méthodes d'extension dans les templates T4: D ... Mais j'ai peur que jusque-là vous n'ayez pas d'autre choix. –

+0

Et si vous spécifiez la version de VB.NET dans votre déclaration? Quelque chose comme <# @ template language = "VBv9" debug = "true" #>, en remplaçant v3.5 avec le numéro de version le plus récent de VB (9 ou 10 je crois)? Est-ce que ça marche ? –

2

J'ai eu du mal à faire fonctionner cela moi-même, même avec le billet de blog trouvé here (également référencé par @jlvaquero dans un commentaire ci-dessus).

ce qui a finalement fonctionné pour moi utilisait le visual studio macro vars puis importer l'espace de noms

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