没有C的参考项目B.

时间:2016-07-20 13:43:41

标签: c#

我有三个项目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。

这可能吗?

3 个答案:

答案 0 :(得分:4)

您将无法避免引用C,因为CBaseClassBInheritingClass的公共接口的一部分。在不知道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,您不得泄露从CBA的所有内容。组合是解决问题的一种方法,但这实际上意味着您需要在CBaseClass中重新构建BNoLongerInheritingClass的公共接口。

答案 2 :(得分:0)

不,您不能使用未引用的程序集中定义的类。 (除了反射动态加载)。维护这个参考层次结构正是NuGet等工具开发的原因。