Cómo determinar si ParameterInfo es de tipo genérico?
-
12-10-2019 - |
Pregunta
Tengo un MethodInfo
de un GenericMethodDefinition. Tales como: CallMethod<T>(T arg, string arg2)
. Los getParameters () método me dará dos objetos ParameterInfo, el primero de los cuales es genérico, el segundo de los cuales no lo es. ¿Cómo puedo llegar a ParameterInfo me dicen que es genérico? ¿Qué hay de si tiene limitaciones?
Solución
Comprobar ParameterType.IsGenericParameter
.
También es posible que desee comprobar ContainsGenericParameters
, que será cierto para algo así 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
([Flags]
una enumeración) para new()
, struct
o limitaciones class
.
Otros consejos
creo que busca los siguientes:
parameterInfo.ParameterType.ContainsGenericParameters
parameterInfo.ParameterType.GetGenericParameterConstraints()
En adicional a la respuesta de otros a la segunda pregunta: ¿Sí se puede obtener de las limitaciones 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>
{
}
No es una limitación de este método, pero el método no tiene parámetros (piensa en Enumerable.Cast ). Lo que voy a decir es que la restricción no es parte de los parámetros, pero el método en sí. Podemos obtener las restricciones por:
method.GetGenericArguments()[0].BaseType //the constraint of T
method.GetGenericArguments()[1].BaseType //that of V: Object
aquí se encuentra información reflejando sobre parámetros genéricos ...