Comment déterminer si ParameterInfo est de type générique?
-
12-10-2019 - |
Question
J'ai un MethodInfo
d'un GenericMethodDefinition. Tels que: CallMethod<T>(T arg, string arg2)
. La méthode GetParameters () me donnera deux objets ParameterInfo, dont le premier est générique, dont le second est pas. Comment puis-je obtenir ParameterInfo pour me dire qu'il est générique? Qu'en est-il si elle a des contraintes?
La solution
Vérifier ParameterType.IsGenericParameter
.
Vous pouvez également consulter ContainsGenericParameters
, qui sera vrai pour quelque chose comme MyMethod<T>(List<T> param)
. (Même si List<>
est pas un paramètre générique)
Si IsGenericParameter
est vrai, vous pouvez aussi appeler GetGenericParameterConstraints()
pour obtenir des contraintes d'interface ou de type de base, et vous pouvez vérifier GenericParameterAttributes
(un [Flags]
ENUM) pour new()
, struct
ou contraintes de class
.
Autres conseils
Je pense que vous cherchez ces:
parameterInfo.ParameterType.ContainsGenericParameters
parameterInfo.ParameterType.GetGenericParameterConstraints()
En plus de la réponse des autres à la deuxième question: Oui, nous pouvons obtenir les contraintes de ParameterInfo
en utilisant GetGenericParameterConstraints()
, mais il ne fonctionne pas pour toutes les circonstances. Considérons une méthode générique comme ceci:
public static void MyMethod<T,V>() where T : Dictionary<int, int>
{
}
Il y a une contrainte pour cette méthode, mais la méthode n'a pas de paramètres (pensez Enumerable.Cast ). Ce que je vais dire est la contrainte ne fait pas partie des paramètres, mais la méthode elle-même. Nous pouvons obtenir les contraintes par:
method.GetGenericArguments()[0].BaseType //the constraint of T
method.GetGenericArguments()[1].BaseType //that of V: Object