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

时间:2009-08-27 15:36:53

标签: c#

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

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

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

namespace AssemblyB
{
  class B
  {
    private A MyA { get; set; }
  }
}

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

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; }
  }
}

这有效,但它的缺点是它会向世界其他地方公开IB。我想要做的是IB internal。但是B无法从中获得。

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

3 个答案:

答案 0 :(得分:8)

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

  

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

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

[assembly:InternalsVisibleTo("name_of_friend_assembly")]

答案 1 :(得分:4)

这里似乎最大的问题是让装配B看到装配A的一个特定成员。

根据重复原始问题部分的评论,这否定了使用记录良好的InternalsVisibleTo属性的可行性。

或者是吗?

您是否考虑使用标记为IB的{​​{1}}接口及其自己的internal属性向A和B创建新的程序集C?

这至少以受控制的方式暴露IB,而不会暴露所有的A到B.我不是解决方案的忠实粉丝(我个人会继续在A上使用InternalsVisibleTo建议,然后记录我的其余内部以保持其他人在一起),但我知道你来自哪里 - 这至少解决了这个问题。

答案 2 :(得分:1)