1

采用三个 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 中公开模型的属性?

4

1 回答 1

0

你是否定义你的财产Friend并不重要。

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

于 2013-11-11T18:53:16.170 回答