扩展方法无法识别

时间:2013-08-23 18:38:20

标签: vb.net razor extension-methods

我在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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

您是否在views文件夹中的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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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