Вопрос про видимость типов

Представьте, что у меня есть некий контейнер, который хранит в себе компоненты. У контейнера есть методы:

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, который будет давать доступ будущему редактору.

Проблема таким образом решается, но не дает возможности другим участникам моего проекта (тем, кто захочет сделать свой редактор) получить к этому методу доступ (так как атрибуту надо явно указать наименование будущего проекта).

→ Ссылка