Как определить, имеет ли ParameterInfo универсальный тип? - PullRequest
7 голосов
/ 19 января 2011

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

Ответы [ 4 ]

7 голосов
/ 19 января 2011

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

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

3 голосов
/ 19 января 2011

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

parameterInfo.ParameterType.ContainsGenericParameters
parameterInfo.ParameterType.GetGenericParameterConstraints()
2 голосов
/ 19 января 2011

В дополнение к ответу других на второй вопрос: Да, мы можем получить ограничения из 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
1 голос
/ 19 января 2011

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

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