如何从另一个程序集中的内部接口派生

sbi*_*sbi 2 c#

我是C#新手,所以请耐心等待我.

好的,所以我在不同的程序集中有两个需要互相引用的类:

namespace AssemblyA
{
  class A 
  {
    private B MyB { get; set; }
  }
}

namespace AssemblyB
{
  class B
  {
    private A MyA { get; set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道不允许循环引用,所以我使用的是一个接口:

namespace AssemblyA
{
  public interface IB
  {
     // whatever 'A' needs of 'B'
  }

  class A 
  {
    private IB MyB { get; set; }
  }
}

namespace AssemblyB
{
  class B : AssemblyA.IB
  {
    private A MyA { get; set; }
  }
}
Run Code Online (Sandbox Code Playgroud)

这有效,但它的缺点是暴露IB给世界其他地方.我想做的是做IB internal.但后来B无法从中衍生出来.

在C++中,我会结交B朋友并完成.我知道C#没有朋友(双关语没有打算,但是注意到了),所以我必须做不到.我已经读过它有一个属性,但是这将使整个程序集的整个程序集都A可以访问B,这是我不喜欢的.有没有办法避免这种情况?

Nol*_*rin 8

事实上你被误导了 - C#/ .NET确实支持朋友集会.您希望将两个程序集标记为Google 朋友程序集,MSDN将其定义如下:

可以从另一个程序集访问程序集中的内部类型或内部成员.

因此,只需将以下属性放在项目中的一个代码文件中(我会选择AssemblyInfo.cs).

[assembly:InternalsVisibleTo("name_of_friend_assembly")]
Run Code Online (Sandbox Code Playgroud)

  • @sbi:是的,你不可能让所有内部成员对整个其他程序集都可见.然而,为什么这不适合你呢?当然,如果你想做这种事情,根据定义,这些组件可以相互信任吗? (2认同)