Vermeiden einer mehrdeutigen Übereinstimmungsausnahme

115

Ich rufe eine statische Methode zum Parsen eines Typs über Reflektion auf, da ich den Typ des Objekts zur Kompilierungszeit nicht kenne (ich weiß jedoch, dass es eine Parse- Methode gibt, die eine Zeichenfolge verwendet).

Ich erhalte jedoch eine mehrdeutige Übereinstimmungsausnahme, vermutlich weil es viele überladene Parse- Methoden gibt, die jeweils ein einzelnes Objekt (Zeichenfolge, int, double usw.) verwenden.

Wie kann ich meinen Methodenaufruf genauer festlegen, um sicherzustellen, dass ich die richtige Methode ( Parse (Zeichenfolge) ) erreiche und die Ausnahme nicht ausgelöst wird?

Mein Code sieht folgendermaßen aus:

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

Antworten:

193

Verwenden Sie diese Überlastung und verwenden Sie

returnType.GetMethod("Parse", new [] {typeof(string)})
Benjamin Podszun
quelle
9
@Bitterblue Ich bin verwirrt, warum Sie diesen Kommentar schreiben würden - und warum Sie Stilfragen für diskussionswürdig halten?
Benjamin Podszun
9
Die Präsentation ist in Ordnung, sie folgt einfach einem anderen Stil als dem, den Sie zu bevorzugen scheinen. Sie kommentierten nach dem Motto "Ich würde diesen Fahrradschuppen benutzen, wenn er etwas bläulicher wäre". Was mich verwirrt. Kommentar bearbeiten: Wenn Sie nicht bewusst sind , dass neue [] {} folgert tatsächlich den Typ des Array und IS auf neue Art Äquivalent [] in diesem Fall? In diesem Fall tut es mir leid - ich habe angenommen, dass Sie den Stil kommentieren (beide funktionieren), während Sie möglicherweise denken, dass das Snippet falsch ist (es ist nicht).
Benjamin Podszun
1
Danke für die Antwort, Leute. Verwenden Sie für Referenztypen Folgendes, um dem nächsten Kerl Probleme zu ersparen: typeof (string) .MakeByRefType ();
BRebey
5
@Bitterblue Ich bin nicht 'jung' und das klingt sicher herablassend. Ein Programmierer, der nicht lesen kann, new [] { typeof(string) }hat andere Probleme als das Verwalten von Code. Der Typ ist buchstäblich genau dort. Außerdem sind 'verrückte Einzeiler' nicht relevant. Ihr bevorzugter Stil fügt dieser Zeile nur redundante Buchstaben hinzu. Ich würde behaupten, dass dies new Type[] {...}weniger lesbar ist, da die Leitung länger ist und das irrelevante Informationen / Boilerplate / Rauschen sind. Daraus folgt: Es ist eine Frage des Stils und die Diskussion mit einem passiven aggressiven gestartet ‚upvoted hätte, wenn es nach meinem Geschmack bieten würde‘ ..
Benjamin Podszun
2
Seien Sie vorsichtig, es funktioniert nicht, wenn 2 Methoden den gleichen Namen, die gleiche Anzahl von Parametern und die gleichen Arten von Parametern haben. Ich denke hier an explizite Überladungen von Cast-Operatoren. Zum Beispiel public static explicit double(MyType obj)und public static explicit float(MyType obj). Sie werden noch eine haben AmbiguousMatchException. In diesem Fall könnten Sie returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))zum Beispiel verwenden.
Guillaume