Инструмент для защиты и внутренней защиты?

Это продолжение этого вопроса.

У меня класс чувствительный к безопасности A и иерархия оболочек, которые его используют (классы B а также ChildOfB). B должен инициализировать экземпляр A и разрешить ChildOfB использовать это. Пример A должен быть доступен только для B а также 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.

2 ответа

Решение

Начиная с C# 7.2 есть конструкция private protected ( ссылка), которая делает работу.

Если речь идет только о предотвращении случайных ошибок, а не о безопасности, вы можете использовать статический анализатор для обеспечения соблюдения этого правила. Установите видимость internal и пусть анализатор выдаст предупреждение / ошибку, когда эти классы используются не так, как вам нравится.

Другие вопросы по тегам