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