如何在C#项目中使用VB.Net扩展方法
我有一个遗留的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
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: