为了尽可能容易地解决这个问题,我正在尝试实现一个通用池系统,只要它们实现了就可以处理任意数量的具体类IBaseComponent
。
因此,在我管理池的班级中,我有一个池字典:
Dictionary<Type, Pool<IBaseComponent>> pools;
因为这将允许我创建尽可能多的实现类IBaseComponent
(可以这么说,这是一个非常“低级”的接口 - 所以实现它的类不会兼容得太远),并且可以有一个每个人的游泳池。
现在,我遇到的问题是第一次将 an 加载IBaseComponent
到池中,可以说是作为模板。
这个模板对象是从 XML 加载的,而不是代码,所以我在编译时没有它的实际类,只有在运行时(它在 XML 定义中定义,我通过反射获取正式的类型)。这一切都很好而且很花哨,但正如我们所知,泛型依赖于编译时安全。
因此,使用一些反射技巧,我有以下内容:
var type = typeof(MyChildComponent);
var genericType = typeof(Pool<>);
var specificType = genericType.MakeGenericType(type);
var pool = Activator.CreateInstance(specificType );
pools.Add(T, pool as Pool<IBaseComponent>);
假设一些类:
public class MyChildComponent : IBaseComponent
当我添加到池字典时,问题出现在第一个块的最后一行。实例化池的强制转换Pool<IBaseComponent>
失败,导致将 null 插入到字典中。
我对你们这些好人的问题是:有什么合理的方法可以解决这个问题吗?任何可能的方式,甚至?
如果我需要通过一些外部方法(XML、TXT 等)为池的至少第一个模板对象、池可以用于的每个可能的具体类加载元素,而我只能访问顶级接口和类的正式类型(都在外部定义文件中定义),我可以在这里做什么吗?
或者这根本不可能?