【问题标题】:Extension Methods in T4T4 中的扩展方法
【发布时间】:2012-04-11 18:53:42
【问题描述】:

我正在尝试在 VS2008 for VB.NET 的 T4 模板中使用 PGK.Extensions,我得到:

RemoveAllSpecialCharacters 不是字符串的成员..

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

但这会破坏 VS2008 插件中的 DevArt T4 编辑器智能感知和语法高亮。请改用有形 T4 编辑器。

【问题讨论】:

    标签: vb.net visual-studio-2008 .net-3.5 t4 tangible-t4-editor


    【解决方案1】:

    即使找到了 here 的博文(@jlvaquero 在上面的评论中也引用了),我自己也很难让这个工作。

    最终对我有用的是使用 visual studio macro vars 然后导入命名空间

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

    【讨论】:

      【解决方案2】:

      虽然扩展方法出现在要应用于对象的代码中,但实际上它被编译为静态方法。来自 Microsoft 的 link 将为您提供更多信息。

      所以调用 item.Name.RemoveAllSpecialCharacters() 实际上编译为 StringExtensions.RemoveAllSpecialCharacters(item.Name)

      因此,您可以尝试编写(未经测试,但应该可以):

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

      希望对您有所帮助。

      【讨论】:

      • 它的作品,但这打破了扩展方法的力量。我找到了这个链接blogs.msdn.com/b/garethj/archive/2008/10/30/… 和作者作品。也许是 C# 而不是 VB?
      • 您可以随时要求 MS 在 T4 模板中正确实现扩展方法 :D ...但恐怕在那之前您别无选择。
      • 如果您在声明中指定 VB.NET 的版本?像 之类的东西,用最新的 VB 版本号替换 v3.5(我相信是 9 或 10)?有用吗?
      • 对于 2008 是 v9。试过 VBv9 和 VBv9.0 还是不行。 :( 无论如何,我会将您的答案标记为已接受。谢谢。
      • 如果你真的想以这种方式使用扩展方法,另一种选择是用 C# 编写你的 T4 模板,但仍然让它输出 VB.Net 代码,如果你没有任何限制的话语言。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2015-03-12
      • 1970-01-01
      • 2020-10-22
      相关资源
      最近更新 更多