尝试自定义我的petapoco体验,我有以下情况:
class Animal
{
// common properties
}
class Dog:Animal
{
//particular properties including custom attributes for properly working with DB
}
class Cat:Animal
{
}
通常,我使用
List<Dog> ret = db.Query<Dog>("select * from dogs").ToList();
我创建了一个列表(类别),用于保存数据库中的表和实际在我的代码中实现的对象之间的跟踪(例如,类狗)
所以我在运行时从类别列表中获取类型:
Type t = ((Category)Categories.Current).ObjectType;
在我的调试器中,我可以看到t的Dog
类型。但我不知道如何将运行时获取的类型转换为可用于
List<t> ret = db.Query<t>("select * from ...").ToList();
提前致谢,
PS。我不想将基础Animal用于查询列表,因为结果列表将填充GridView
,派生类(例如Dog)包含用于显示,过滤等的特定属性。
答案 0 :(得分:1)
我认为你能做的最好的事情就是这样:
public static IList FetchAllByCategory(Type category)
{
string sql = "select * from " + category.Name + "s";
if (category == typeof(Dog)) return db.Fetch<Dog>(sql);
if (category == typeof(Cat)) return db.Fetch<Cat>(sql);
...
}
请注意,您不能将List<Animal>
用作返回类型,因为派生类型的列表不与基类型列表分配兼容。 IList
是这里最大的共同点。但GridView有可能实际看到分配给其数据源的真实 List<T>
。 (通常,数据绑定源的类型为object
。
Fetch<T>()
与Query<T>
类似,但返回List<T>
而不是IEnumerable<T>
。
答案 1 :(得分:0)
@GáborBakos谢谢。
好吧,我找到了一种方法但需要在Animal类中添加虚拟虚拟GetObjects(),然后为每个Dog,Cat等重写GetObjects()。
Type type = ((Category)Categories.Current).ObjectType; // get type
object rtObject = Activator.CreateInstance(type); // create instance
((Animal)rtObject).GetObjects(); // call some known base method
但这提出了一个问题:我需要这种复杂的方式吗?
我想我可以按类型创建一个带有硬编码开关的GetObjects(),然后调用真正的方法。