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