C# 中的延迟初始化"proxy"



假设我有一个对象树,其中包含来自一组(相当大的)类的对象;类或多或少在我的控制之下(并且说,每个实现IBaseInterface,用于语义类型)。 树通常以深度优先的方式填充。但是,有时必须在执行流中的不同位置创建节点;因此,我需要一些可以充当对象的占位符(类似代理)的东西。占位符应包含对其创建位置的引用,而不会对基础类型/对象(装饰器样式)产生任何其他干扰。

我在想类似的东西

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

但是,这不起作用,因为 C# 不能让泛型类从其类型参数继承。

当然,蛮力方法是在运行时动态生成类以规范;但这似乎有点太极端了(如果我必须手动摆弄 Reflection.Emit,这很麻烦)。

创建此类占位符对象的最佳方法是什么?

(额外说明:这很像Lazy<T>,除了对象通常应该是原始类型;否则,在处理父节点之前无法构造代理对象。

你追求的是一个虚拟代理。下面是一个简单的示例。假设您有一个急切加载的Bitmap类:

interface IBitmap { void Draw(); }
class Bitmap : IBitmap
{
Bitmap(string filename)
{
WriteLine($"Loading bitmap from {filename}");
}
void Draw()
{
WriteLine($"Drawing bitmap!");
}
}

虚拟代理是一个包装器,它在需要时不会加载位图:

class VirtualBitmap : IBitmap
{
private Bitmap bitmap;
private string filename;
public VirtualBitmap(string filename)
{
this.filename = filename;
}
void Draw()
{
if (bitmap == null) bitmap = new Bitmap(filename);
bitmap.Draw();
}
}

请随意使用Lazy<T>

最新更新