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

如何在C#项目中使用VB.Net扩展方法,c#,.net,vb.net,C#,.net,Vb.net,我有一个遗留的VB.Net类库,其中包括一些扩展方法,其中一个大致如下: Namespace Extensions Public Module OrmExtensions <Extension()> Public Function ToDomainObjectCollection(ByRef objects As OrmCollection(Of OrmObject)) As DomainObjectCollection

我有一个遗留的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
命名空间扩展
公共模块或扩展
公共函数ToDomainObjectCollection(ByRef对象作为OrmCollection(OrmObject的))作为DomainObjectCollection
返回objects.AsQueryable().ToDomainObjectCollection()
端函数
公共函数ToDomainObjectCollection(ByRef对象作为IQueryable(属于OrmObject))作为DomainObjectCollection
作为新域ObjectCollection()的Dim文档
对于对象中的每个o
doc.Add(o.ToDomainObject())
下一个
退货单
端函数
端模块
结束命名空间
要在VB中使用这些扩展,我只需导入extensions.OrmExtensions。我有另一个项目,是C语言的,它依赖于带有扩展的VB,我无法让它们工作。OrmExtensions不可用,仅使用命名空间VBProject。扩展不使扩展可用

有多个项目依赖于VB项目,理想情况下,扩展应该对所有项目都可用

我在谷歌上搜索了一段时间,但没有找到任何关于在C#中实际使用VB扩展方法的信息。我想问题是他们必须在一个模块中,但我还不能确认这一点


我不希望在任何需要扩展方法的地方重复它们(特别是在我们的单元测试项目中,它是C#)的。

您不应该使用
ByRef

VB.Net(显然)支持
ref
参数上的扩展方法;C#(正确地)没有

参数中的
ByRef
ref
)允许方法将新实例分配给调用者传递的变量或字段。

它们应该很少使用。

您应该扩展
IEnumerable
,而不是
IQueryable
。如果在C中正确使用,键入
或扩展,然后查找方法,会发生什么?它们是怎样出现的?它们看起来像有效的扩展方法吗?将这些扩展方法编译为外部库,然后从c#添加对该库的引用projet@TimS. 这个方法根本不可用。@SLaks我不同意。如果您需要扩展IQueryable,那么这是可以接受的。也许你需要进一步解释一下?(这里使用它们的事实可能表明对ByRef的含义缺乏理解,这应该得到解决。)@EricJ.:首先,
对象的值在这两种方法中都没有改变。为什么您希望它是
ByRef
?如果它是
ByRef
,且值不断变化,这意味着什么?例如,如果您在方法调用的结果上调用它,会发生什么情况?@EricJ.:调用站点要么隐式传递
ref
(允许该方法意外更改调用方),要么生成一个隐藏的临时变量(可能会破坏该方法)@JonSkeet ByRef被使用(可能是天真的)试图避免创建大型集合的副本可能会花费高昂的成本。@JustinEdwards:是的,这表明您不理解
ByRef
的含义(或者更确切地说,对于引用类型,
ByVal
的含义)。值得一读我的基于C#的关于这个主题的文章——同样的原则也适用于VB: