C#运行时类型列表(petapoco)

时间:2015-06-07 20:46:54

标签: c# sql database

尝试自定义我的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)包含用于显示,过滤等的特定属性。

2 个答案:

答案 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(),然后调用真正的方法。