Vous êtes en train de découvrir ou d’utiliser la reflection, avec .net. Et tout d’un coup, vous vous demandez : hey mais comment je peux appeler une méthode d’une classe, alors qu’en fait j’en ai deux surcharges ?
Découvrons comment invoquer invoquer une méthode, sans ambigous message, avec la reflection dans .net core, avec C#.
Une classe Toucan
Prenons cette classe Toucan(pourquoi Toucan : c’est beau un toucan, non ?, … j’avais que cette réponse ;D)
OK, impecc, et en plus elle hérite d’Animal. Si vous voulez le code de la classe Animal, demandez-le nous
Vous notez qu’elle a deux méthodes Voler :
- Une avec un paramètre,
- Une sans paramètre
Maintenant appelons-la avec la reflection, avec MethodInfo et GetType
Nous appelons le .GetType(), qui nous permet d’accéder au .GetMethod(), pour récupérer une méthode donnée.
OK, mais voilà, logiquement, à l’exécution, nous obtenons ça :
Comment lever cette exception d’exécution, à votre avis ?
Préciser le(s) type(s) des paramètres de la méthode, lors de l’appel
Il nous “suffit” de préciser le ou les types qu’il y aura, lors de l’Invoke de la méthode.
Ici, nous précisons que nous appelons la méthode Voler qui un argument de type Action<string> : un délégué vers une procédure.
Invoke la méthode souhaitée
Petite particularité, nous avons ici à passer un paramètre qui est un délégué vers une procédure, avec un argument de type string (rien que ça ).
Comment alors passer ce délégué, durant l’appel à la méthode ?
L’astuce ici, c’est de créer une variable du type souhaité, et de pointer vers la méthode qu’on souhaite passer. (oui, tout ça pour ça ).
Nous obtenons le code final suivant. Il utilise donc :
- GetType
- GetMethod
- Invoke
- Un passage de paramètre
- Un paramètre qui est un délégué anonyme