Я пытаюсь составить список всех созданных классов среды выполнения, созданных общим классом. Другими словами, если у меня есть класс:
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<>);
) Я не уверен, что "построено" - это правильное слово - я хочу знать либо все конкретные производные классы, действующие в данный момент, либо все из них, которые когда-либо будут существовать (не знаю, как С# обрабатывает общую конструкцию за кулисами).