【问题标题】:How can I use VB.Net extension methods in a C# project如何在 C# 项目中使用 VB.Net 扩展方法
【发布时间】:2013-05-09 01:46:11
【问题描述】:

我有一个遗留的 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

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

有多个项目依赖于 VB 项目,理想情况下,这些扩展应该可供所有项目使用。

我已经进行了相当多的谷歌搜索,但无法找到任何关于在 C# 中实际使用 VB 扩展方法的信息。我认为问题在于它们必须在模块中,但我无法确认。

我宁愿不要在任何需要它们的地方复制扩展方法(尤其是在我们的单元测试项目中,它是用 C# 编写的)。

【问题讨论】:

  • 你应该扩展IEnumerable&lt;T&gt;,而不是IQueryable&lt;T&gt;
  • 如果在 C# 中正确使用,键入 OrmExtensions. 并查找方法会发生什么?它们是如何出现的?它们看起来像有效的扩展方法吗?
  • 将这些扩展方法编译为外部库,然后从您的 c# projet 添加对该库的引用
  • @TimS。该方法根本不可用。
  • @SLaks 我不同意。如果您需要扩展 IQueryable,那么这是可以接受的。也许您需要进一步解释?

标签: c# .net vb.net


【解决方案1】:

您不应该使用ByRef

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

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

【讨论】:

  • (这里使用它们的事实可能表明对 ByRef 的含义缺乏理解,应该解决这个问题。)
  • @EricJ.: 一方面objects 的值在这两种方法中都没有改变。为什么你希望它是ByRef?如果它是具有变化值的ByRef,它意味着是什么?例如,如果您在方法调用的结果上调用它会发生什么?
  • @EricJ.:调用站点要么隐式传递ref(允许方法意外更改调用者),要么创建一个隐藏的临时变量(可能破坏方法)
  • @JonSkeet ByRef 被用来(可能是天真地)试图避免创建大型集合副本的潜在成本高昂。
  • @JustinEdwards:是的,这表明你不明白 ByRef 的含义(或者更确切地说,ByVal 对引用类型的含义)。值得阅读我关于该主题的基于 C# 的文章 - 与 VB 相同的原理:pobox.com/~skeet/csharp/parameters.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多