【问题标题】:Extension method not being recognized无法识别扩展方法
【发布时间】:2013-08-23 18:38:19
【问题描述】:

我在 VB.NET 中有一个 Web 应用程序项目,我正在尝试添加一个扩展方法以在视图中使用。

Extensions.vb

Imports System.Runtime.CompilerServices    
Namespace MyApp
    Public Module Extensions
        <Extension()> _
            Public Function GetValOrDefault(ByVal dict As Dictionary(Of String, String), ByVal key As String, ByVal defaultVal As String) As String
                    Dim val As String
                    If (dict.TryGetValue(key, val)) Then
                        Return val
                    End If
                Return defaultVal
            End Function
        End Module
End Namespace

View.cshtml

@Code
    Dim msgs As Dictionary(Of String, String) = New Dictionary(Of String, String)
    msgs("Foo") = "Bar"
    Dim val As String = msgs.GetValOrDefault("Foo", "Bar")
End Code

但是,这不起作用,显示以下错误:

'GetValOrDefault' is not a member of 'System.Collections.Generic.Dictionary(Of String, String)'.

这是一个相当简单的扩展方法,我不知道为什么它没有被采纳。还尝试添加一个更简单的扩展,只接受一个字符串并返回一个字符串,但问题相同,所以似乎扩展方法没有被拾取。

尝试编译,也没有运气。请注意,该模块与视图在同一个项目中,但我认为这不会有任何区别(我在 C# 项目中这样做没有问题)。

是否有我遗漏的步骤或其他事情需要完成才能使其正常工作?

【问题讨论】:

    标签: vb.net razor extension-methods


    【解决方案1】:

    这是一个老问题,但是,如果其他人也摸不着头脑,请确保检查包含扩展名的文件的 Build Action 是否设置为 Compile。经过两个小时安静地发疯并想知道为什么扩展程序只在某些地方有效,我意识到它被设置为内容。快速更改编译并且它起作用了。 :)

    【讨论】:

      【解决方案2】:

      您是否在视图文件夹中的 web.config 中包含命名空间“MyApp”?

      <system.web.webPages.razor>
          <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
          <pages pageBaseType="System.Web.Mvc.WebViewPage">
            <namespaces>
              <add namespace="System.Web.Mvc" />
              <add namespace="System.Web.Mvc.Ajax" />
              <add namespace="System.Web.Mvc.Html" />
              <add namespace="System.Web.Routing" />
              <add namespace="MyApp"/>
            </namespaces>
          </pages>
        </system.web.webPages.razor>
      

      注意:添加到 web.config 后,您可能必须关闭并重新打开视图才能使扩展程序可用于 Intellisense。

      另一种选择是将您的 MyApp 命名空间直接导入视图:@Import MyApp

      【讨论】:

      • 试过了,没区别。扩展方法仍未被拾取。
      • 我不经常使用VB.net。 属性后的下划线是什么?
      • 另外,您的扩展程序有 2 个参数,而您只提供一个。
      • 它用于续行,以帮助代码的清洁度,因此您在屏幕上确实有超长的代码行
      • @Sam 同样,C# 是我选择的语言。下划线通常用于连接线,但在这里没有太大区别。缺少第二个参数只是复制到问题的代码中的错误。
      【解决方案3】:

      您可以定义扩展的类型。我刚试了没问题。

      Public Module Extensions
       <Runtime.CompilerServices.Extension()> _
       Public Function GetValOrDefault(Of dict As Dictionary(Of String, String))(ByVal d As dict, ByVal key As String, ByVal defaultVal As String) As String
        Dim val As String = ""
        If (d.TryGetValue(key, val)) Then
         Return val
        End If
        Return defaultVal
       End Function
      End Module
      

      【讨论】:

        【解决方案4】:

        对我来说,这是因为我的扩展方法依赖于我的调用项目不包含的引用。

        这是通过静态调用导致 vs 显示错误的方法而可见的。引用所需的 dll 解决了问题,并允许我将其作为扩展名调用。

        【讨论】:

          猜你喜欢
          • 2011-02-05
          • 2022-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多