Модификатор доступа "public" даёт доступ к члену класса для всех других классов. Возможно ли сделать член класса доступным только для некоторых других классов? Уточнения вопроса: внутри одной сборки; следующие модификаторы доступа не подходят: public, private, internal, protected, protected internal, private protected.
Возможность доступа из некоторых классов (не из всех):
Члены, помеченные модификатором доступа internal - к ним имеют доступ все типы внутри данной сборки, а также типы из дружественных (см. соседний ответ) сборок.
Члены, помеченные модификатором доступа protected - к ним имеют доступ все типы-наследники данного.
Члены, помеченные модификатором protected internal - это объединение двух предыдущих пунктов, т.е. имеют доступ все типы из данной и дружественных сборок, а также типы-наследники из любых сборок.
Члены, помеченные модификатором private protected (C# 7.2 и выше) - это пересечение первых двух пунктов, т.е. имеют доступ типы-наследники данного, но только в пределах данной сборки или дружественных.
Вложенные типы имеют неограниченный доступ ко всем членам данного типа (даже к private).
Можно определить дружественные сборки пометив их специальным атрибутом
InternalsVisibleTo
Вот пример из MSDN:
using System.Runtime.CompilerServices;
using System;
[assembly: InternalsVisibleTo("AssemblyB")]
// The class is internal by default.
class FriendClass
{
public void Test()
{
Console.WriteLine("Sample Class");
}
}
// Public class that has an internal method.
public class ClassWithFriendMethod
{
internal void Test()
{
Console.WriteLine("Sample Method");
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей