当我在设计时不知道POCO的确切类型,而在运行时只得到Type时,如何使用ServiceStack中的OrmLite正确地反序列化POCO?
所以,类似这样:
// Returns the object and can be cast to the correct subobject
public BaseClass ReadObject(Type typeOfObject, int id)
{
using (var db = _dbFactory.Open())
{
baseObject = db.Select<BaseClass>(typeOfObject, id); // need something here...
return baseObject;
}
}
...
BaseClass bc = ReadObject(someType, 3); // someType = Customer for example
...
class BaseClass { ... }
class Actor : BaseClass { ... }
class Customer : Actor { ... }
class Operator : Actor { ... }
我坚持使用Actor和Customer,但是当我读回它们时,我基本上只有一个Type,可能还有主键。 .Select<>
不起作用,因为我需要在运行时知道类型。
我发现这个:Create (and select from) a table dynamically using servicestack ormlite
而且,如果我理解正确,那么在设计时获取类型未知的POCO的唯一方法是执行手动SQL语句,如答案所示:
var modelDef = employeeType.GetModelMetadata();
var tableName = db.GetDialectProvider().GetQuotedTableName(modelDef);
var sql = $"SELECT * FROM {tableName}";
var results = db.Select<List<object>>(sql);
var results = db.Select<Dictionary<string,object>>(sql);
var results = db.Select<dynamic>(sql);
但是,这不会创建顶部列出的任何类;我需要将其类型转换为BaseClass,但它当然应该是正确的对象(因此,“ Customer”,“ Operator”等)。
我该如何实现?
[[(我还指出,Mythz曾说过在持久化数据时使用继承是一个坏主意,他提议“拉平”层次结构。但是,我会伸出脖子说在处理面向对象时语言,继承和多态性是不可避免的,那里没有99.9%的编码人员可以消除;-))]]
当我在设计时不知道POCO的确切类型,但是在运行时只得到Type时,如何使用ServiceStack中的OrmLite正确反序列化POCO。因此,如下所示://返回...