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

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

4 ответов


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

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


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

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

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

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

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

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

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