Éviter une exception de correspondance ambiguë

115

J'appelle une méthode statique Parse sur un type via la réflexion car je ne connais pas le type de l'objet au moment de la compilation (je sais, cependant, il a une méthode Parse , prenant une chaîne).

Cependant, j'obtiens une exception de correspondance ambiguë, probablement parce qu'il y a beaucoup de méthodes Parse surchargées prenant chacune un seul objet (chaîne, int, double etc.).

Comment puis-je être plus spécifique dans mon appel de méthode pour m'assurer que j'atteins la bonne méthode ( Parse (string s) ) et que l'exception n'est pas levée.

Mon code ressemble à ceci:

Type returnType = p.PropertyType;
object value = returnType.GetMethod("Parse").Invoke(null, new string[] { "1" });
Ben Aston
la source

Réponses:

193

Utilisez cette surcharge et utilisez

returnType.GetMethod("Parse", new [] {typeof(string)})
Benjamin Podszun
la source
9
@Bitterblue Je ne comprends pas pourquoi vous écrivez ce commentaire - et pourquoi vous considérez que les questions de style méritent d'être discutées?
Benjamin Podszun
9
La présentation est bonne, elle suit simplement un style différent de celui que vous semblez préférer. Vous avez dit: «J'utiliserais cet abri à vélos, s'il était un peu plus bleuâtre». Ce qui me trouble. Modification du commentaire: à moins que vous ne sachiez pas que new [] {} déduit réellement le type du tableau et EST équivalent à new Type [] dans ce cas? Dans ce cas, je suis désolé - j'ai supposé que vous commentiez le style (les deux fonctionnent) tout en pensant potentiellement que l'extrait de code est faux (ce n'est pas le cas).
Benjamin Podszun
1
Merci pour la réponse, les gars. Pour éviter au prochain gars des problèmes, pour les types de référence, utilisez quelque chose comme ceci: typeof (string) .MakeByRefType ();
BRebey
5
@Bitterblue Je ne suis pas «jeune» et cela semble condescendant. Un programmeur qui ne peut pas lire new [] { typeof(string) }a d'autres problèmes que la gestion du code. Le type est littéralement là. De plus, les `` one-liners fous '' ne sont pas pertinents, votre style préféré ajoute simplement des lettres redondantes dans cette même ligne. Je dirais que new Type[] {...}c'est moins lisible, car la ligne est plus longue et ce sont des informations / passe-partout / bruit non pertinents. Par conséquent: C'est une question de style et vous avez commencé la discussion avec un agressif passif «aurait voté pour, si cela répondait à mon goût».
Benjamin Podszun
2
Attention, cela ne fonctionnera pas si 2 méthodes ont les mêmes noms, le même nombre de paramètres et les mêmes types de paramètres. Je pense ici aux surcharges d'opérateurs de cast explicites. Par exemple public static explicit double(MyType obj)et public static explicit float(MyType obj). Vous aurez toujours un fichier AmbiguousMatchException. Dans ce cas, vous pouvez utiliser returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))par exemple.
Guillaume