代码之家  ›  专栏  ›  技术社区  ›  sbi

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

c#
  •  2
  • sbi  · 技术社区  · 15 年前

    我是个新手,所以请容忍我。

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

    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++中,我会做 一个朋友和被完成。我知道C没有朋友(双关语不是有意的,但注意到了),所以我必须离开。 我已经读到它有一个属性,但这将构成整个程序集 A 可供整个组件使用 我不喜欢。 有没有办法避免这种情况?

    3 回复  |  直到 15 年前
        1
  •  4
  •   John Rudy    15 年前

    这里的大问题似乎是让B总成看到A总成的一个具体成员。

    根据重申原始问题一部分的评论,这否定了使用充分记录的 InternalsVisibleTo 属性。

    还是这样?

    你有没有考虑用 IB 接口已标记 internal 以及它自己的 内部可见到 A和B的属性?

    这至少以一种可控的方式暴露了i b,而没有将a和b全部暴露出来。我不是这个解决方案的超级粉丝(我个人只需继续使用 内部可见到 在已经建议的上,然后记录下我的其他内部结构,以使其他人保持一致),但是我理解您来自哪里——这至少解决了问题。

        2
  •  8
  •   Noldorin    15 年前

    事实上你被误导了-C/.NET确实支持朋友集会。您要将两个程序集标记为 Friend Assemblies ,其中msdn定义如下:

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

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

    [assembly:InternalsVisibleTo("name_of_friend_assembly")]