处理抽象类和类型参数固有的类

我有一个基本抽象类及其抽象类型参数:

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

然后我有许多固有的儿童课程:

 public class ShopDatabase : Database {} public class ShopItem : DatabaseItem {} public class WeaponDatabase : Database {} public class WeaponItem : DatabaseItem {} ... 

现在,我想使用Dictionary来跟踪数据库以及使用DatabaseItem类型返回它们的方法,如下所示:

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

然后它给了我“’T’必须是一个非抽象类型,带有一个公共无参数构造函数,以便将它用作参数’T’”错误,因为DatabaseItem是抽象的。 我将DatabaseItem设为非抽象类型,错误消失但仍然出现了很多类型转换错误……

发现了类似的问题,但我还是不明白……

实现这一目标的更好的解决方案/结构是什么?

最简单的方法是将Database后代存储为对象:

 static class DatabaseManager { private static Dictionary databases = new Dictionary(); // .... public static Database GetDatabase() where T : DatabaseItem, new() { return (Database)databases[typeof(T)]; } } 

即使您使用无参数构造函数将DatabaseItem转换为非抽象类,这也无济于事,因为typeof(Database) != typeof(Database)

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

更新

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

使用reflection:

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

对于这样的情况:

 class FooDatabase : Database {} class BooDatabase : FooDatabase {} // etc... 

你需要循环遍历inheritance树才能找到Database

坏消息是,如果没有强制转换,您就无法使用代码。 为数据库定义非generics类型或inerface,然后使用此代码:

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