如何避免由 Friend 属性引起的间接引用?

Posted

技术标签:

【中文标题】如何避免由 Friend 属性引起的间接引用?【英文标题】:How can I avoid an indirect reference caused by a Friend property? 【发布时间】:2013-11-23 14:04:20 【问题描述】:

获取三个 VB.net 程序集:A、B 和 C。A 引用 B,B 引用 C,但 A 不引用 C。给定以下三个类(每个程序集中一个类):

组装A

Public Class View()

    Public Property ViewModel as SomeViewModel

End Class

大会B

Public Class SomeViewModel()

    'Compiler is ok with private variable _Model, doesn't complain.
    Private _Model as SomeModel
    Friend Sub New(Model as SomeModel)
        Me._Model = Model
    End Sub

    'Compiler complains when Friend property is added, requiring A to directly
    'reference C.
    Friend ReadOnly Property UnderlyingModel as SomeModel        

End Class

汇编C

Public Class SomeModel()

    Public Property ModelID as Integer

End Class

本质上,Assembly C 包含一个模型 (SomeModel),它由 Assembly B 中的 SomeViewModel 包装。SomeViewModel 通过“Friend”属性将该模型暴露给 AssemblyB 中的其他类。 Assembly A 中的 View 包含 SomeViewModel,但由于 Friend 修饰符,该 View 无法访问 SomeViewModel.UnderlyingModel 属性。

鉴于此配置,VS 2010 在编译程序集 A 时会出现以下编译错误:

Error   3   Construct makes an indirect reference to project 'AssemblyC',
which contains 'AssemblyC.SomeModel'. Add a project reference to 'AssemblyC' to your
project.

有没有一种方法可以通过 Friend 修饰符公开 UnderlyingModel 属性,而无需 Assembly A 引用 Assembly C?我原以为 Friend 修饰符会使这成为可能,因为程序集 A 中的视图无法访问在程序集 C 中公开模型的属性?

【问题讨论】:

【参考方案1】:

是否将属性定义为Friend 并不重要。

当编译器构建您的程序集 A 时,它会找到在程序集 B 中定义的类型。我猜您创建了一个项目引用,因此它也构建了一个程序集 B。现在,程序集 B 需要程序集 C 才能工作,没有它就无法使用您的解决方案。所以这个程序集也必须对编译器可用。我想它可以作为文件参考提供,但如果它是您自己的代码,那么在一天结束时始终如一地使用项目参考会更方便。

【讨论】:

C 被 B 引用(项目引用),所以当编译器构建 B 时,它应该构建 C。Visual Studio 要求 C 被 A 直接引用。在添加 Friend 属性之前,我有很多ViewModel (B) 中引用程序集 C 的私有变量,但编译器不会抱怨它们,只会抱怨 Friend 属性。我将更新我的代码以显示这一点。 我无法真正重现您的场景。这一切都对我有用,没有编译错误...... 实际应用当然比这里的例子复杂。在实际应用程序中,视图使用绑定源(Windows 窗体)绑定到视图模型。绑定源或 Windows 窗体设计器本身可能会发生一些有趣的事情。我会看看我是否可以仅用我的示例代码重现问题并报告。

以上是关于如何避免由 Friend 属性引起的间接引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建只能由特定类使用的构造函数。 (C# 中的 C++ Friend 等效项)

如何避免由于cv2.undistort引起的延迟?

Json.NET如何避免循环引用

如何使用间接引用遍历数组?

如何避免内部类中的内存泄漏

如何解决这个由 GridSearch 引起的 best_estimator_ 错误?