Отложенная инициализация «прокси» в C # - PullRequest
4 голосов
/ 15 апреля 2019

Давайте предположим, что у меня есть дерево объектов с объектами из (довольно большого) набора классов;классы более или менее под моим контролем (и, скажем, каждый реализующий IBaseInterface, для семантической типизации).Дерево обычно заполняется в глубину.Однако иногда узлы должны быть созданы в другом месте в потоке выполнения;поэтому мне нужно что-то, что может выступать в качестве заполнителя (прокси-как) для объектов.Заполнитель должен содержать ссылку на то, где он был создан, без какого-либо вмешательства в базовый тип / объект (стиль декоратора).

Я думал о чем-то похожем на

interface IPlaceholder
{
    PositionReference RealLocation { get; }
}

class Placeholder<T> : T, IPlaceholder
{
    PositionReference RealLocation { get; private set; }
}

Однако это не сработает, поскольку C # не может иметь универсальные классы, наследуемые от их параметров типа.

Подход с использованием грубой силы, разумеется, заключался бы в динамической генерации классов во время выполнения согласно спецификации;но это кажется слишком экстремальным (и громоздким, если мне придется возиться с Reflection.Emit вручную).

Каков наилучший подход для создания таких объектов-заполнителей?

(Дополнительное примечание:Это очень похоже на Lazy<T>, за исключением того, что обычно ожидается, что объект будет иметь исходный тип, в противном случае объект прокси не может быть создан до обработки родительского узла.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...