我正在尝试列出由泛型类创建的所有运行时构造的类.换句话说,如果我有一个类:
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>,…}
用例涉及一个通用的分配器,它支持任何类型的对象分配(就像新的XXX(),但更适合垃圾收集器).我不会详细说明,因为这只会使问题复杂化.基本上,我不会在编译时知道所有构造的类,因为库是一个用于单独的代码项目的DLL.所以我将需要一些形式的反思,我似乎不能在互相之间找到.
Assembly.GetExecutingAssembly().GetExportedTypes()不包含任何基类通用类(即typeof(GenericCls)))
typeof(GenericCls).GetGenericArguments()只返回类型“T”,它不仅是一个无效的类型,而且完全没用.
如果你只知道通用类的类型,是否可以找到所有构造的通用类的类? (typeof(GenericCls)))我不知道“构造”是否是正确的词 – 我想知道当前活动的所有具体的泛型派生类,或者所有这些将永远存在的(不确定) C#如何处理幕后的通用构造).
解决方法
@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()检查它,它正在工作.呵呵