gpt4 book ai didi

c# - 泛型问题和使用运行时类型,而不是(泛型)T

转载 作者:太空狗 更新时间:2023-10-30 01:07:05 25 4
gpt4 key购买 nike

为了尽可能简单地解决问题,我正在尝试实现一个通用池系统,该系统可以处理任意数量的具体类,只要它们实现了 IBaseComponent。 .

所以,在我管理池的类中,我有一个池字典:

Dictionary<Type, Pool<IBaseComponent>> pools;

因为这将允许我创建尽可能多的类来实现 IBaseComponent (这是一个非常“低级”的接口(interface),可以这么说——所以实现它的类不会兼容得太远)如我所愿,并且每个接口(interface)都可以有一个池。

现在,我遇到的问题是第一次加载 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

当我添加到 pools 字典时,问题出现在第一个 block 的最后一行。实例化池的转换为 Pool<IBaseComponent>失败,导致 null 被插入到字典中。

我想问你们这些好人:有什么合理的解决方法吗?有什么可能的方法吗?

如果我需要通过某种外部方法(XML、TXT 等)至少为池的第一个模板对象加载元素,对于池可用于的每个可能的具体类, 我能访问的只是类的顶层接口(interface)和形式类型(都定义在外部定义文件中),我可以在这里做任何事情吗?

或者这根本不可能吗?

最佳答案

您使用的是 .Net 4+ 吗?如果是这样,您可以创建一个接口(interface) IPool<out T> . out使通用参数协变,这意味着它将接受任何版本的接口(interface),其通用参数为 T 或从 T 派生。

出于某种原因,协变/逆变仅适用于接口(interface)和委托(delegate),这就是您需要 IPool 的原因。

您的词典将变成:

Dictionary<Type, IPool<IBaseComponent>>() pools;

我在脑海中将它与反射结合起来有点困难,但我认为这应该可行。如果没有,请告诉我,我会花更多时间在我的测试代码上。

关于c# - 泛型问题和使用运行时类型,而不是(泛型)T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13577291/

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