这是我们正在处理的自定义 ORM 事情。这不是很棒,但这是我们决定要做的。
基本上,基类Entity
由任意数量的其他类扩展。这些子类必须使用属性进行注释。
有一种特定类型的属性是集合。该属性定义了集合的子类型。
例如。
public class Blah2 : Entity
{
...
}
public class Blah : Entity
{
[QRel(Type = typeof(Blah2)]
public IEnumerable<Blah2> blahs;
}
加载这些子对象很容易,但它们是作为基本类型加载的,Entity
.
通过反射,所以在运行时我在 ORM 管理器中:
- 属性中标注的类型:
Type t
- blahs 的字段信息:
FieldInfo f
- 类型的实体实例
Blah
:i
- 包含一组
Blah2
实例的通用加载列表:List<Entity> l
我需要lt
使用派生类型创建一个列表t
(即动态创建和填充 a List<Blah2>
)并将其分配给 type 字段Blah
:
var lt = ...
f.SetValue(i, lt);
请注意,因为这都是通过反射完成的,所以我拥有的对象的类型是:t
-> Type
,i
-> Entity
,f
-> FieldInfo
,l
-> List<Entity>
。