Давайте предположим, что у меня есть дерево объектов с объектами из (довольно большого) набора классов;классы более или менее под моим контролем (и, скажем, каждый реализующий IBaseInterface
, для семантической типизации).Дерево обычно заполняется в глубину.Однако иногда узлы должны быть созданы в другом месте в потоке выполнения;поэтому мне нужно что-то, что может выступать в качестве заполнителя (прокси-как) для объектов.Заполнитель должен содержать ссылку на то, где он был создан, без какого-либо вмешательства в базовый тип / объект (стиль декоратора).
Я думал о чем-то похожем на
interface IPlaceholder
{
PositionReference RealLocation { get; }
}
class Placeholder<T> : T, IPlaceholder
{
PositionReference RealLocation { get; private set; }
}
Однако это не сработает, поскольку C # не может иметь универсальные классы, наследуемые от их параметров типа.
Подход с использованием грубой силы, разумеется, заключался бы в динамической генерации классов во время выполнения согласно спецификации;но это кажется слишком экстремальным (и громоздким, если мне придется возиться с Reflection.Emit вручную).
Каков наилучший подход для создания таких объектов-заполнителей?
(Дополнительное примечание:Это очень похоже на Lazy<T>
, за исключением того, что обычно ожидается, что объект будет иметь исходный тип, в противном случае объект прокси не может быть создан до обработки родительского узла.)