C # Получить список всех построенных во время выполнения классов универсального класса - PullRequest
10 голосов
/ 12 февраля 2011

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

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 # обрабатывает обобщенную конструкцию за кадром).

Ответы [ 2 ]

4 голосов
/ 12 февраля 2011

@ Дэвид Мортенссон: Ваш ответ дал мне идею. Я мог бы создать статический список типов в любом неуниверсальном классе и зарегистрировать каждый созданный класс так, как он был создан (когда 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(), и оно работает. О, хватит.

3 голосов
/ 12 февраля 2011

Вы можете использовать фабричный класс для создания экземпляров, чтобы фабричный класс мог хранить список всех созданных классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...