2012-03-28 15 views
5

Estoy tratando de utilizar PGK.Extensions en una plantilla de T4 en VS2008 para VB.NET y me sale:métodos de extensión en T4

RemoveAllSpecialCharacters no es miembro de la cadena ..

Mi encabezados 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 de la extensión de código de bloque:

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

RemoveAllSpecialCharacters es un método de extensión de cadena de PGK.Extensions.dll.

¿Alguien me puede ayudar?

EDITADO:

OK. Es:

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

Pero esto rompe DevArt T4 Editor IntelliSense y la sintaxis resaltado en VS2008 plugin. Use Tangible T4 Editor en su lugar.

Respuesta

1

Mientras que un método de extensión aparece desde el código que se aplicará a un objeto, de hecho se compila como un método estático. Este link de Microsoft le dará más información sobre eso.

Así llamando item.Name.RemoveAllSpecialCharacters() es, de hecho, compilado como StringExtensions .RemoveAllSpecialCharacters (item.name)

Por lo tanto, se podría tratar de escribir (no probado, pero debería funcionar):

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

Espero que ayude.

+0

Sus obras pero esto rompe el poder de los métodos de extensión. Encontré este enlace http://blogs.msdn.com/b/garethj/archive/2008/10/30/using-extension-methods-in-t4-templates.aspx y para el autor funciona. Tal vez C# pero no VB? – jlvaquero

+0

Siempre puede pedirle a MS que implemente correctamente los métodos de extensión en las plantillas T4: D ... Pero me temo que hasta entonces no tiene otra opción. –

+0

Y si especifica la versión de VB.NET en su declaración? Algo así como <# @ template language = "VBv9" debug = "true" #>, reemplazando v3.5 con el número de versión más reciente de VB (9 o 10, creo). Funciona ? –

2

Me costó trabajo hacer esto, incluso con la publicación de blog here (también mencionada por @jlvaquero en un comentario anterior).

lo que finalmente funcionó para mí estaba usando el visual studio macro vars luego importar el espacio de nombres

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