Инструмент для защиты и внутренней защиты?
Это продолжение этого вопроса.
У меня класс чувствительный к безопасности 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
и пусть анализатор выдаст предупреждение / ошибку, когда эти классы используются не так, как вам нравится.