C#获取泛型类的所有运行时构造类的列表

时间:2011-02-11 22:19:05

标签: c# class generics reflection

我正在尝试列出由泛型类创建的所有运行时构造类。换句话说,如果我有一个班级:

public GenericCls<T> {
    public void Reset() { ... }
    ...
}

我在这样的各个地方都有代码:

GenericCls<int> gci = new GenericCls<int>();
GenericCls<String> gcs = new GenericCls<String>();
GenericCls<float> gcf = new GenericCls<float>();
...

我可以得到这样的东西吗?:

Type[] allconstructed = GetAllConstructed(typeof(GenericCls<>));

返回{GenericCls<int>,GenericCls<String>,GenericCls<float>,...}

用例涉及一个通用分配器,它支持任何类型的对象分配(类似new XXX(),但对垃圾收集器更好)。我不会详细说明,因为它只会使问题复杂化。基本上,我不会在编译时知道所有构造的类,因为该库是一个旨在与单独的代码项目一起使用的DLL。所以我需要某种形式的反射,我似乎无法在互联网上找到它。

Assembly.GetExecutingAssembly().GetExportedTypes()除了基本通用类(即typeof(GenericCls<>)

之外不包含任何内容

typeof(GenericCls<>).GetGenericArguments()仅返回类型“T”,这不仅是无效类型,而且完全没用。

如果只知道泛型类的类型,是否甚至可以找到泛型类的所有构造类? (typeof(GenericCls<>);)我不确定“构造”是否是正确的词 - 我想知道所有当前活动的具体泛型派生类,或者所有这些将存在的(不确定C#如何处理)幕后的通用建筑。)

2 个答案:

答案 0 :(得分:4)

@DavidMårtensson:你的回答给了我一个想法。我可以在任何非泛型类中创建一个静态的类型列表,并在构造时注册每个构造的类(当T已知时)。 即。

static public class ConcreteList {
    static public List<Type> concrete;
}
public class GenericCls<T> {
    static GenericCls() {
        ConcreteList.concrete.Add(typeof(GenericCls<T>));
    }
}

我用ConcreteList.concrete[x].GetGenericArguments()检查了它,它正在运行。哦,快点。

答案 1 :(得分:3)

您可以使用工厂类来创建实例,这样工厂类可以保留所有已创建类的列表。