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

时间:2013-11-11 17:09:23

标签: .net vb.net access-modifiers

取三个VB.net程序集:A,B和C.引用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包装.TomeViewModel通过“Friend”属性将模型公开给AssemblyB中的其他类。程序集A中的视图包含SomeViewModel,但由于“朋友”修改器,“视图”无法访问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.

有没有办法通过朋友修饰符公开UnderlyingModel属性而没有程序集A参考程序集C?我原以为Friend修饰符会使这成为可能,因为程序集A中的View无法访问在程序集C中公开模型的属性?

1 个答案:

答案 0 :(得分:0)

如果您将属性定义为Friend,则无关紧要。

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