我有三个项目A,B和C.它们连接在一起如下:
A - > B - > ç
如果项目C有这样的基础:
public class CBaseClass
{
public string Name { get; set; }
}
和项目B有一个继承类,如下所示:
public class BInheritingClass : CBaseClass
{
}
如何在项目A中访问BInheritingClass.Name而不会给我以下错误:
类型' CBaseClass'在未引用的程序集中定义。您必须添加对程序集&Project C的引用,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。
当我没有A引用C时。
澄清我希望项目A引用B,它使用来自C的东西,而不使用A引用C。
这可能吗?
答案 0 :(得分:4)
您将无法避免引用C,因为CBaseClass
是BInheritingClass
的公共接口的一部分。在不知道BInheritingClass
的情况下,项目A无法知道CBaseClass
的完整定义。
如果你想避免这种情况,你必须避免继承并使用组合 - 使BInheritedClass
不继承CBaseClass
,而是在内部包含它,而不是将其暴露为参数或公共成员。只有这样才能保留B的实施细节,而不是其合同的一部分。
答案 1 :(得分:2)
如果项目A
以任何方式使用项目C
中公开定义的任何内容,则需要引用C
。在您的示例中,项目A基于C中定义的内容定义了一个类,因此您需要引用C。
您更新了问题
这个答案仍然是正确的:当B
根据BInheritingClass
中定义的CBaseClass
定义C
时,A
需要知道C
是否需要使用B
中的类,否则它不会知道"基本功能" CBaseClass
的{{1}}因此无法确定BInheritingClass
的功能。
如果您不希望A
知道"知道" C
,您不得泄露从C
到B
到A
的所有内容。组合是解决问题的一种方法,但这实际上意味着您需要在CBaseClass
中重新构建BNoLongerInheritingClass
的公共接口。
答案 2 :(得分:0)
不,您不能使用未引用的程序集中定义的类。 (除了反射动态加载)。维护这个参考层次结构正是NuGet等工具开发的原因。