gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:23:53 25 4
gpt4 key购买 nike

假设我有一个对象树,其中包含一组(相当大的)类的对象;类或多或少在我的控制之下(比如,每个实现 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>相反。

关于c# - C# 中的延迟初始化 "proxy",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55695160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com