0

这是这个问题的后续。

我有一个安全敏感类A和使用它的包装层次结构(类BChildOfB)。B必须初始化一个实例 A并允许ChildOfB使用它。的实例A应该只能访问Band访问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 中的任何代码,那也很棒。

4

2 回答 2

1

如果这只是为了防止意外错误,而不是为了安全,您可以使用静态分析器来强制执行此规则。internal当这些类以您不喜欢的方式使用时,将可见性设置为并让分析器发出警告/错误。

于 2013-11-30T11:44:53.453 回答
1

从 C# 7.2 开始,有一个构造private protected链接)可以完成这项工作。

于 2017-11-18T08:56:38.720 回答