【发布时间】:2013-05-03 03:26:20
【问题描述】:
这是一个两部分的问题。
首先
我有一个名为 ComponentList 的类,如下所示:
public class ComponentList<T> : List<T> where T : Component
{
}
现在我想创建一个空的无类型 ComponentLists 列表:
List<ComponentList<>> MasterList = new List<ComponentList<>>();
我收到一个错误,因为 ComponentList 想要指定一个泛型类型,即使我还没有尝试初始化任何 ComponentList(只是包含它们的 MasterList)。如何在不初始化任何 ComponentLists 的情况下声明 ComponentLists 的 MasterList(因为我计划在运行时使用仅在运行时知道的类型来初始化它们)?毕竟,MasterList 需要包含不同泛型类型的 ComponentList,而不仅仅是一个。
其次
我知道以前有人问过这个问题,但我似乎无法理解任何提议的解决方案的概念。
如您所知,我有一个名为 MasterList 的List<>,它是一个 ComponentLists 列表(一个自定义类)。 ComponentList 是未定义类型的泛型类(被限制为 Component 的子类型)。
在以下示例中,我尝试检查 ComponentList 泛型类型(从 MasterList 引用)是否与此类(调用代码的类)相同。
if (MasterList[i].GetType() == typeof(ComponentList<this.GetType()>))
{
}
问题是,代码是从未知的子类中自动调用的,而不是从这个父类中调用的。所以 ComponentList 泛型类型需要和子类的类型进行比较,而不是这个基类。因此,“this.GetType”代替了实际基类的硬编码名称。
在 ComponentList 中传递的this.GetType() 类型显然返回“预期类型”错误,因为GetType() 返回编译时类型,而不是运行时类型(这是我需要的)。
那么我怎样才能得到运行时类型呢?如果我做不到,那么完成我想做的事情的最佳选择是什么? (我听说过一些叫做反射的东西,它可能对我有帮助,但我真的不明白)。
【问题讨论】:
-
使用泛型的全部目的是编译时类型安全。类型在编译时已知并且需要提供参数。
-
那么我将如何制作一个不是泛型的列表(因此编译时类型不安全)?