我有一个遗留的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#中).
你不应该使用ByRef
.
VB.Net(显然)支持ref
参数的扩展方法; C#(理所当然地)没有.
A ByRef
(ref
在C#中)参数允许该方法将新实例分配给调用者传递的变量或字段.
它们应该很少使用.