隐藏“朋友”程序集中的内部接口

时间:2010-05-28 02:50:13

标签: c# .net

我有两个程序集: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.有人可以帮我理解发生了什么吗?

2 个答案:

答案 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,这意味着默认情况下该实现是公开的。