2011-01-19 16 views
7

Tengo un MethodInfo de una GenericMethodDefinition. Tales como: CallMethod<T>(T arg, string arg2). El método GetParameters() me dará dos objetos ParameterInfo, el primero de los cuales es genérico, el segundo de los cuales no. ¿Cómo puedo obtener que ParameterInfo me diga que es genérico? ¿Qué pasa si tiene restricciones?¿Cómo se determina si ParameterInfo es de tipo genérico?

+1

gracias a los mods para la creación de la etiqueta ParameterInfo – smartcaveman

Respuesta

7

Compruebe ParameterType.IsGenericParameter.
Es posible que también desee comprobar ContainsGenericParameters, que será cierto para algo como MyMethod<T>(List<T> param). (A pesar de que List<> no es un parámetro genérico)

Si IsGenericParameter es cierto, también puede llamar para obtener GetGenericParameterConstraints() interfaz de tipo base o limitaciones, y se puede comprobar GenericParameterAttributes (una enumeración [Flags]) para new(), struct, o class restricciones

+0

¿qué pasa con las limitaciones de parámetros genéricos? – smartcaveman

+0

En caso de que 'args' sea una matriz de' T [] ', se pueden usar' ParameterType.IsArray' y 'ParameterType.ContainsGenericParameter'. – user492238

1

Tal here encontrará información sobre que reflejan los parámetros genéricos ...

3

creo que busca estas:

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

En adicional a la respuesta de otros a la segunda pregunta: ¿Sí se puede consiga las restricciones de ParameterInfo usando GetGenericParameterConstraints(), pero no funciona para todas las circunstancias. Considere algún método genérico de esta manera:

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

hay una restricción para este método, pero el método no tiene parámetros (pensar Enumerable.Cast). Lo que voy a decir es que la restricción no es parte de los parámetros, sino el método en sí mismo. Podemos obtener las restricciones por:

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