取三个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中公开模型的属性?
答案 0 :(得分:0)
如果您将属性定义为Friend
,则无关紧要。
当编译器构建程序集A时,它会找到在程序集B中定义的类型。我猜你创建了一个项目引用,因此它也构建了程序集B.现在,程序集B需要程序集C才能工作,没有它就无法使用你的解决方案。所以这个程序集也必须可用于编译器。我想它可以作为文件引用提供,但如果它是你自己的代码,那么在一天结束时使用项目引用会更加方便。