处理抽象类和类型参数固有的类
我有一个基本抽象类及其抽象类型参数:
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
。
请注意, 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 ; }