扩展方法未被识别

3

我有一个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#项目中做过这个,没有问题)。
是否有一些步骤或其他需要完成的事情才能使其工作?
4个回答

3

这是一个老问题,但如果其他人也在苦恼,请确保检查包含扩展名的文件的“生成操作”设置是否为“编译”。经过两个小时的沉默疯狂和思考为什么扩展名只在某些地方起作用后,我意识到它被设置为“内容”。快速更改为“编译”,它就可以工作了。:)


或者像我一样,只构建你的库的调试版本,但是你的主程序却引用了发布版本。=( - undefined

0
你在视图文件夹的 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

尝试过了,没有任何区别。扩展方法仍然没有被捕捉到。 - Mun
1
我不经常使用VB.net。 <Extension()>属性后面的下划线是用来做什么的? - Sam
此外,您的扩展有2个参数,而您只提供了一个。 - Sam
这是为了代码的可读性而设计的行继续符,以避免在屏幕上出现过长的代码行。 - Derek Meyer
@Sam Yea,我觉得这个项目(继承的代码库)还有其他一些奇怪的问题。无论如何,还是谢谢你的帮助。 - Mun
显示剩余2条评论

0

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

通过静态调用该方法使其可见,导致 VS 弹出错误。引用所需的 dll 可以解决此问题,并允许我将其作为扩展进行调用。


0

您可以为扩展定义类型。我刚试过,没有任何问题。

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

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