gpt4 book ai didi

c# - 处理类继承自抽象类和类型参数

转载 作者:太空狗 更新时间:2023-10-29 23:21:23 25 4
gpt4 key购买 nike

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

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 {}

...

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

Dictionary<Type, Database<DatabaseItem>> databases;

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

然后它给了我"'T' 必须是具有公共(public)无参数构造函数的非抽象类型才能将其用作参数'T'" 错误,因为 DatabaseItem 是抽象的。我将 DatabaseItem 设置为非抽象类型,错误消失了,但仍然出现了很多类型转换错误...

找到一个类似的question但我还是不明白...

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

最佳答案

最简单的方法是存储 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> 相同类。

更新

is there a way to know what type parameter a class using? e.g. giving ShopDatabase, I want to get ShopItem. I need it when I initialize databases dictionary

使用反射:

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

对于这样的情况:

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

您需要遍历继承树才能找到 Database<FooItem> .

关于c# - 处理类继承自抽象类和类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34305723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com