我有两个程序集:A和B.A为InternalsVisibleTo设置为B.我想从A中调用以获取只能通过B中定义的类型来保存信息的信息。我可以使用A中定义的内部接口并在B中明确实现
汇编A
internal interface IHasData
{
Data GetData();
}
class ClassA
{
DoSomething(IHasData);
}
装配B
public abstract class ClassB : IHasData
{
Data IHasData.GetData() { /** do something internal **/ }
}
当有人引用程序集B并从ClassB派生时出现问题 - 它们得到错误:“类型'AssemblyA.IHasData'在未引用的程序集中定义”,即使该类型对它们不可见。如果我查看公共类型定义,我会看到我所期望的 - 没有实现接口的ClassB。
为什么会出现此错误?所有的实现都在程序集B中。我可以在ClassB内部使用IHasData,并且不需要引用程序集A.有人可以帮我理解发生了什么吗?
答案 0 :(得分:3)
这是一个有趣的发现,但是当引用公开这些依赖项时,它看起来像引用引用的依赖项的规则仍然适用于显式接口实现。我在here之前已经回答了几个问题。
更好的解决方案是支持组合优于继承,并在程序集B未公开的内部类中定义IHasData
的实现。这些方面的东西:
public abstract class ClassB
{
class HasData : IHasData
{
HasData(ClassB b) {m_b = b;}
Data IHasData.GetData() { m_b.GetData(); }
}
private readonly HasData m_hasData;
public ClassB() {
m_hasData = new HasData(this);
}
internal Data GetData() {
/** do something internal **/
}
}
答案 1 :(得分:0)
ClassB
在其程序集之外是公开可见的,因此它的所有基类型 - 类和接口 - 也必须是公开可见的。除非您为该程序集提供ClassB
,否则来自其他程序集中IHasData
的内容将无法看到InternalsVisibleTo
。
ClassB
也明确地实现了IHasData
,这意味着默认情况下该实现是公开的。