Подтвердить что ты не робот

С# Получить список всех построенных классов среды выполнения общего класса

Я пытаюсь составить список всех созданных классов среды выполнения, созданных общим классом. Другими словами, если у меня есть класс:

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

4b9b3361

Ответ 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 мог бы хранить список всех созданных классов.