Вопрос про видимость типов
Представьте, что у меня есть некий контейнер, который хранит в себе компоненты. У контейнера есть методы:
public Component GetComponent(Type type)
{
return etc...;
}
public IEnumerable<T> GetComponents<T>() where T : Component
{
if(typeof(T) == typeof(Component))
throw new Exception("T not be equal type of Component. Use concrete type!");
return etc...;
}
public void Remove(Type type)
{
return etc...;
}
private class PrivateComponent : Component
{
}
Моя идея заключалась в том, что если в контейнере будут компоненты с видимостью private
или internal
, то к ним доступ можно получить только из сборки, где были созданы эти компоненты. Это даёт гарантию, что твой, защищенный компонент внешне не тронут.
Это работало до тех пор, пока я не задумался о визуальном редакторе своего проекта. Чтобы визаулизировать все общедоступные компоненты в контейнере, мне приходится вызывать метод GetComponents<Component>()
, но сам же попадаю на свои ограничения. Сделать отдельный метод GetComponents()
только для будущего проекта - не выход, так как этот метод будет общедоступным (и соответственно будет виден остальным сборкам) и можно будет удалить приватный компонент.
А если убрать заглушку if(typeof(T) == Typeof(Component))
, то любой другой может получить доступ к компоненту GetComponents<Component>()
и может удалить их все.
Вопрос: как получить от контейнера только общедоступные компоненты, но и оставить возможность получать локальные компоненты созданные в пределах своей сборки?
Update #1: видимо, нельзя разграничивать доступ к компонентам по проектам или классам. Нельзя сделать так, чтоб один проект получал все себе известные компоненты из экземпляра контейнера container1
, а другой проект получал из того же контейнера container1
только public
компоненты. Проблема, думаю, решится, если будет возможность делать
похожую проверку в GetComponents<Component>
: если метод вызвал вот этот проект/класс и ему виден тип InternalComponent
, то добавить его в результат.
Ответы (1 шт):
Благодаря пользователю @AlexanderPetrov добавлю метод internal void GetComponents()
с атрибутом InternalsVisibleToAttribute
, который будет давать доступ будущему редактору.
Проблема таким образом решается, но не дает возможности другим участникам моего проекта (тем, кто захочет сделать свой редактор) получить к этому методу доступ (так как атрибуту надо явно указать наименование будущего проекта).