如何在C#项目中使用VB.Net扩展方法

Jus*_*rds 6 .net c# vb.net

我有一个遗留的VB.Net类库,其中包含一些扩展方法,其中一个大致如下:

Namespace Extensions
    Public Module OrmExtensions

        <Extension()>
        Public Function ToDomainObjectCollection(ByRef objects As OrmCollection(Of OrmObject)) As DomainObjectCollection
            Return objects.AsQueryable().ToDomainObjectCollection()
        End Function

        <Extension()>
        Public Function ToDomainObjectCollection(ByRef objects As IQueryable(Of OrmObject)) As DomainObjectCollection
            Dim doc As New DomainObjectCollection()
            For Each o In objects
                doc.Add(o.ToDomainObject())
            Next
            Return doc
        End Function
    End Module
End Namespace
Run Code Online (Sandbox Code Playgroud)

要在VB中使用这些扩展,我只需要导入Extensions.OrmExtensions.我有另一个项目,它在C#中依赖于具有扩展的VB,我无法让它们工作.OrmExtensions不可用,只使用命名空间VBProject.Extensions不会使扩展可用.

有多个项目依赖于VB项目,理想情况下,所有项目都可以使用扩展.

我已经完成了一些谷歌搜索,但还没有找到任何关于在C#中实际使用VB扩展方法的事情.我认为问题是他们需要在模块中,但我无法确认.

我宁愿不在任何需要的地方复制扩展方法(特别是在我们的单元测试项目中,这是在C#中).

SLa*_*aks 5

你不应该使用ByRef.

VB.Net(显然)支持ref参数的扩展方法; C#(理所当然地)没有.

A ByRef(ref在C#中)参数允许该方法将新实例分配给调用者传递的变量或字段.
它们应该很少使用.

  • @JustinEdwards:是的,这表明你不明白`ByRef`是什么意思(或者更确切地说,'ByVal`对于引用类型意味着什么).值得阅读关于该主题的基于C#的文章 - 与VB相同的原则是相同的:http://pobox.com/~skeet/csharp/parameters.html (4认同)
  • (而且他们在这里被使用的事实可能表明缺乏对ByRef含义的理解,应该解决这个问题.) (3认同)