Как определить, имеет ли ParameterInfo универсальный тип?

У меня есть MethodInfo общего определения метода. Такие как: CallMethod<T>(T arg, string arg2), Метод GetParameters() даст мне два объекта ParameterInfo, первый из которых является универсальным, а второй - нет. Как я могу получить ParameterInfo, чтобы сказать мне, что это универсальный? А что, если у него есть ограничения?

4 ответа

Решение

Проверьте ParameterType.IsGenericParameter,
Вы также можете проверить ContainsGenericParameters, что будет верно для чего-то вроде MyMethod<T>(List<T> param), (Даже если List<> не является общим параметром)

Если IsGenericParameter это правда, вы также можете позвонить GetGenericParameterConstraints() чтобы получить ограничения интерфейса или базового типа, и вы можете проверить GenericParameterAttributes[Flags] enum) для new(), struct, или же class ограничения.

Я думаю, что вы ищете это:

parameterInfo.ParameterType.ContainsGenericParameters
parameterInfo.ParameterType.GetGenericParameterConstraints()

В дополнение к ответам других на второй вопрос: Да, мы можем получить ограничения от ParameterInfo с помощью GetGenericParameterConstraints(), но это не работает для всех обстоятельств. Рассмотрим некоторый общий метод, подобный этому:

public static void MyMethod<T,V>() where T : Dictionary<int, int>
{
}

Для этого метода есть ограничение, но у метода нет параметров (подумайте о Enumerable. Cast). Я собираюсь сказать, что ограничение - это не часть параметров, а сам метод. Мы можем получить ограничения:

method.GetGenericArguments()[0].BaseType  //the constraint of T
method.GetGenericArguments()[1].BaseType  //that of V: Object

Может быть, здесь вы найдете информацию об отражении общих параметров...

Другие вопросы по тегам