是否有可能在实例化时使用类似内部的访问修饰符而不是声明?

时间:2013-10-15 14:39:52

标签: c# access-modifiers

在以下场景中(原谅我的伪代码):

Assembly Lib:
   Interface A;
   Class 123; //Utilizes multiple properties with a { get; internal set; } pattern.

   //Contains more class definitions like Class 123

Assembly Impl: //References Lib 
   Class MyImpl; //Implements Interface A and utilizes Class 123.


ClientApplication:
   //Consumes Interface A

我想知道是否有一种方法允许Class MyImpl访问类123的属性set(),而不使用静态声明的朋友程序集并保持那些set()也对ClientApplication隐藏。

最终目标是能够以允许ClientApplication利用AssemblyLib中的类型的方式部署它,并且能够删除新的实现程序集而无需重新编译和重新分发Assembly Lib。

我正在考虑找到一种方法来使内部修饰符在其实例化(Assembly Impl)而不是在其声明(Assembly Lib)中生效,但我不相信C#支持这样的任何东西。

我意识到如果可以做到这可能真的很难看,而且我不确定自己能不能这样做,但唉,这就是我在这里的原因!感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

  1. 您可以使用反射来访问Lib的内部。这不是一个很好的解决方案。
  2. 你可以让Impl成为Lib的朋友集会。这不是一个很好的解决方案。
  3. 你可以重构你的设计,以确定Impl访问Lib的内部的需要。这是一个很好的解决方案。
  4. 使用你的例子,这里是我所了解的想法。为什么不将设计更改为:

    Assembly Lib:
       Interface A;
       Interface B; //Utilizes multiple properties with a { get; } pattern.
    
       //Contains more interface definitions like Interface B
    
    Assembly Impl: //References Lib 
        Class 123; //Utilizes multiple properties with a { get; internal set; } 
                   //pattern. Implements B.
    
        //Contains more class definitions like Class 123
    
        Class MyImpl; //Implements Interface A and utilizes Class 123.
    
    ClientApplication:
        //Consumes implementations of Interface A and B provided by Impl.
    

答案 1 :(得分:0)

您可能需要查看InternalsVisibleToAttribute

例如,在Lib程序集中,将此行添加到assemblyinfo.cs文件中:

[assembly:InternalsVisibleTo("Impl")]