T4中的扩展方法

5

我正在尝试在VS2008中的VB.NET中的T4模板中使用PGK.Extensions,但出现以下错误:

RemoveAllSpecialCharacters不是string的成员。

我的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

在块代码中使用扩展:

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

RemoveAllSpecialCharacters是PGK.Extensions.dll中的字符串扩展方法。

有人能帮忙吗?

编辑:

好的,就是这样:

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

但是这会破坏DevArt T4编辑器在VS2008插件中的智能感知和语法高亮。建议改用Tangible T4编辑器。

2个回答

2

1

虽然扩展方法在代码中看起来似乎应用于对象,但实际上它被编译为静态方法。这个链接来自微软,将为您提供更多信息。

因此,调用 item.Name.RemoveAllSpecialCharacters() 实际上被编译为 StringExtensions.RemoveAllSpecialCharacters(item.Name)

因此,您可以尝试编写以下代码(未经测试,但应该可以工作):

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

希望这有所帮助。

它能工作,但这会破坏扩展方法的功能。我找到了这个链接http://blogs.msdn.com/b/garethj/archive/2008/10/30/using-extension-methods-in-t4-templates.aspx,对于作者来说是有效的。也许是C#,但不是VB? - jlvaquero
你可以随时向微软提出请求,在T4模板中正确实现扩展方法 :D ... 但我担心在那之前你别无选择。 - T. Fabre
如果您在声明中指定VB.NET的版本呢?例如<#@ template language="VBv9" debug="true" #>,将v3.5替换为VB的最新版本号(我相信是9或10)?这样行得通吗? - T. Fabre
针对2008版本是v9。尝试了VBv9和VBv9.0,但都无法工作。:( 无论如何,我会将您的答案标记为已接受。谢谢。 - jlvaquero
另一个选择,如果你真的想以那种方式使用扩展方法,就是用C#编写你的T4模板,但仍然输出VB.Net代码,如果语言没有任何限制。 - T. Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接