5

我有一个抽象基类及其抽象类型参数为:从抽象类和类型参数固有处理类

public abstract class Database<T> where T : DatabaseItem, new() { 
    protected List<T> _items = new List<T>(); 
    protected virtual void Read (string[] cols) { 
    T item = new T(); 
    ... 
} 

public abstract class DatabaseItem { 
    ... 
} 

然后,我有固有孩子类的数量从它:

public class ShopDatabase : Database<ShopItem> {} 
public class ShopItem : DatabaseItem {} 

public class WeaponDatabase : Database<WeaponItem> {} 
public class WeaponItem : DatabaseItem {} 

... 

现在,我想把一个字典来跟踪数据库和使用DatabaseItem类型返回它们的方法,如下所示:

Dictionary<Type, Database<DatabaseItem>> databases; 

public static Database<T> GetDatabase<T>() where T: DatabaseItem { 
    return databasebases [typeof (T)]; 
} 

然后,它给了我“‘T’必须是一个非抽象类型与公共参数构造函数,以便用它作为参数‘T’”,因为DatabaseItem是抽象错误。我做了DatabaseItem非抽象类型,错误是走了,但还是很多类型转换错误的走了出来......

发现了类似的question但我还是不明白......

有什么更好的解决方案/结构如何实现?

+0

大概定义为您的数据库类的接口,如 字典<类型,了IDatabase> –

回答

3

,你可以做最简单的就是存储Database<T>后裔为对象:

static class DatabaseManager 
{ 
    private static Dictionary<Type, object> databases = new Dictionary<Type, object>(); 

    // .... 

    public static Database<T> GetDatabase<T>() 
     where T : DatabaseItem, new() 
    { 
     return (Database<T>)databases[typeof(T)]; 
    } 
} 

即使你把DatabaseItem非 - 带无参数构造函数的抽象类,这也无济于事,因为typeof(Database<ShopItem>) != typeof(Database<DatabaseItem>)

请注意,GetDatabase<T>方法的通用约束必须与Database<T>类相同。

Upd

有没有办法知道一个类使用什么类型的参数?例如ShopDatabase给出 ,我想要ShopItem。我需要它,当我初始化 数据库字典

使用反射:

var databaseItemType = typeof(ShopDatabase).BaseType.GetGenericArguments()[0]; 

对于类似案例:

class FooDatabase : Database<FooItem> {} 
class BooDatabase : FooDatabase {} 
// etc... 

你需要遍历继承树找到Database<FooItem>

+0

我认为,我们几乎没有,有没有办法知道一类使用什么类型的参数? 例如给ShopDatabase,我想要ShopItem。 我需要它时,我初始化*数据库*字典 –

+0

@RichardFu:我已经更新了答案。 – Dennis

1

坏消息是,你不能使用你的代码没有铸造。定义数据库中的非通用型或inerface,然后使用此代码:

Dictionary<Type, Database> databases; 
public static Database<T> GetDatabase<T>() where T: DatabaseItem, new() 
{ 
    return databasebases[typeof(T)] as Database<T>; 
}