引用程序集中的扩展方法?

10

如果我尝试调用我的扩展方法,它的定义如下:

Module LinqExtensions
<System.Runtime.CompilerServices.Extension()> _
Public Function ToSortableBindingList(Of TSource)(ByVal source As IEnumerable(Of TSource)) As IBindingList
    If (source Is Nothing) Then
        Throw New ArgumentNullException("source")
    End If
    Return New SortableBindingList(Of TSource)(New List(Of TSource)(source))
End Function
End Module

通过调用

   Dim sss As String()
   sss.AsEnumerable.ToSortableBindingList()

出现了一个错误:"ToSortableBindingList不是System.Collections.Generic.IEnumerable(Of String)的成员"。

注意:Intellisense 在最后一个句点后自动完成!如果我尝试调用 context.TestTable.AsEnumerable.ToSortableBindingList(TestTable 是 EF4 生成的纯类),它甚至没有在 Intellisense 中显示出来。我不知道为什么。扩展方法声明“ByVal source As IEnumerable(Of TSource)”有什么问题吗?

*********************************** 编辑 ********************************

好的,为了澄清发生了什么,我想提供一些额外的信息。 我可以追踪到问题如下:

场景:

Assembly1 (根命名空间 "myapp"):

...
     <System.Runtime.CompilerServices.Extension()> _
        Public Function ToTest(ByVal source As String) As String
            Return ""
        End Function
...
'

调用有效:

'
...
Dim a as string
a.ToTest()
...

汇编语言2: (包含对汇编语言1的引用)

“调用不起作用:

imports myapp
...
Dim a as string
a.ToTest()

请注意,我的命名空间似乎存在问题。扩展方法位于不同命名空间的另一个项目中,我像往常一样导入(我可以在智能感知中看到所有其他方法!) - user449253
是的,为了使扩展方法起作用,它们必须在范围内 - 这就是编译器(和智能感知)搜索它们的方式。我建议您将您的评论添加为答案。 - VinayC
这不是答案,因为我已经添加了这个命名空间(因此智能感知正在工作,但仍然会划线并显示我已经报告的错误)。 - user449253
1个回答

18

你的命名空间“myapp”不能直接包含函数“ToTest”,因为那里已经定义了一个模块。 请尝试:

Imports myapp.LinqExtensions

要确保它是公共模块


我无法导入该模块(IDE 中显示错误)。我认为这是因为模块会隐式地将它们的名称导入到当前命名空间中。 - user449253
6
你是否将这个模块定义为公共模块?如果没有,那么它将无法从另一个程序集中访问。 - Willem
1
你说得完全正确。如果仔细看,我发现确实缺少了“public”...现在它可以工作了。非常感谢! - user449253

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