这是这个问题的后续。
我有一个安全敏感类A
和使用它的包装层次结构(类B
和ChildOfB
)。B
必须初始化一个实例 A
并允许ChildOfB
使用它。的实例A
应该只能访问被B
and访问ChildOfB
,它暴露给其他程序集并且不能是内部的。
代码示例:
// ************* Library assembly *************
internal class A {}
public abstract class B
{
// compiler error: Inconsistent accessibility: property type
// 'Library.A' is less accessible than property 'Library.B.Property'
protected A Property { get; private set; }
}
public sealed class ChildOfB : B
{
public ChildOfB()
{
Console.WriteLine(Property);
}
}
// ************* in some other assembly *************
var wrapper = new ChildOfB();
据我所知,在普通的 C# 中没有办法做到这一点。
我可以接受使用外部工具的解决方案,它可能会在编译后修改 dll(例如基于某些属性)。例如,在我的代码中,该属性将internal
代替,protected
并且在编译之后,此工具可能会更改 CLR 类型定义以包含缺少的标志(结果应该具有系列和程序集访问修饰符)。如果此工具确保更改属性的访问修饰符不会破坏初始 dll 中的任何代码,那也很棒。