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?

Était-ce utile?

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

Peut-être vous trouverez des informations à propos des paramètres génériques reflétant ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top