С# Получить список всех построенных классов среды выполнения общего класса
Я пытаюсь составить список всех созданных классов среды выполнения, созданных общим классом. Другими словами, если у меня есть класс:
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<>);
) Я не уверен, что "построено" - это правильное слово - я хочу знать либо все конкретные производные классы, действующие в данный момент, либо все из них, которые когда-либо будут существовать (не знаю, как С# обрабатывает общую конструкцию за кулисами).
Ответы
Ответ 1
@David Mårtensson: Ваш ответ дал мне представление. Я мог бы сделать статический список типов в любом не-generic классе и зарегистрировать каждый построенный класс по мере его построения (когда 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()
, и он работает. О, хватайтесь.
Ответ 2
Вы можете использовать класс factory для создания экземпляров, таким образом класс factory мог бы хранить список всех созданных классов.