Отразить все возможные перестановки универсального типа с ограничениями - PullRequest
3 голосов
/ 22 ноября 2011

Учитывая универсальный тип с ограничениями:

class MyClass<T> where T: Alpha
{
}

и реализации этого ограничения:

class Alpha {}
class Bravo : Alpha {}
class Charlie : Alpha {}

Как можно получить универсальные типы для всех комбинаций во время выполнения?

// I want these types at run-time
MyClass<Alpha> 
MyClass<Bravo> 
MyClass<Charlie> 

РЕДАКТИРОВАТЬ: Основываясь на ответе @ rich.okelly, я думаю, что реальный вопрос заключается в следующем:

Как мне найти все типы, которые реализуют ограничение моего универсального типаво время выполнения?

Так что, если мне дадут typeof(MyClass<>), я получу типы выше.

Ответы [ 2 ]

4 голосов
/ 22 ноября 2011

Что-то вроде:

var alphaType = typeof(Alpha);
var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).Where(t => alphaType.IsAssignableFrom(t));
var myClass = typeof(MyClass<>);
foreach (var type in allTypes) 
{
  var genericType = myClass.MakeGenericType(type);
}

Альтернативно, если универсальные типы уже загружены:

var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes()).Where(t => t.IsGenericType && t.GetGenericTypeDefinition() == typeof(MyClass<>));
foreach (var type in allTypes) 
{
  ...
}

Обновление

Вы можетеиспользуйте метод GetGenericArguments() и метод GetGenericParameterConstraints() для получения требуемых типов.

var myType = typeof(MyClass<>);
var typeConstraints = myType.GetGenericArguments().First().GetGenericParameterConstraints();
var allTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes());
var genericTypes = allTypes.Where(t => typeConstraints.All(tc => tc.IsAssignableFrom(t))).Select(t => myType.MakeGenericType(t));
foreach (var type in genericTypes)
{
    ...
}
0 голосов
/ 22 ноября 2011

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

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