Как определить, имеет ли 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
Может быть, здесь вы найдете информацию об отражении общих параметров...