Evitare un'eccezione di corrispondenza ambigua


115

Sto invocando un metodo statico Parse su un tipo tramite reflection perché non conosco il tipo di oggetto in fase di compilazione (so, tuttavia, ha un metodo Parse , prendendo una stringa).

Tuttavia, ricevo un'eccezione di corrispondenza ambigua, presumibilmente perché ci sono molti metodi Parse sovraccaricati , ciascuno dei quali accetta un singolo oggetto (stringa, int, double ecc.).

Come posso essere più specifico nella mia chiamata al metodo per assicurarmi di raggiungere il metodo corretto ( Parse (string s) ) e l'eccezione non viene generata.

Il mio codice ha questo aspetto:

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

Risposte:


193

Usa questo sovraccarico e usa

returnType.GetMethod("Parse", new [] {typeof(string)})

9
@Bitterblue Sono confuso sul motivo per cui hai scritto quel commento e perché consideri questioni di stile degne di nota?
Benjamin Podszun

9
La presentazione va bene, capita solo di seguire uno stile diverso da quello che sembri preferire. Hai commentato sulla falsariga di "Userei questo capanno per bici, se fosse un po 'più bluastro". Il che mi confonde. Modifica del commento: a meno che tu non sappia che new [] {} inferisce effettivamente il tipo di Array e in questo caso è equivalente al nuovo Type []? In tal caso, mi dispiace - ho pensato che tu commentassi lo stile (entrambi funzionano) mentre potenzialmente pensi che lo snippet sia sbagliato (non lo è).
Benjamin Podszun

1
Grazie per la risposta, ragazzi. Per risparmiare qualche problema al prossimo ragazzo, per i tipi di riferimento, usa qualcosa del genere: typeof (string) .MakeByRefType ();
BRebey

5
@Bitterblue Non sono "giovane" e questo suona sicuramente condiscendente. Un programmatore che non new [] { typeof(string) }è in grado di leggere ha altri problemi oltre alla manutenzione del codice. Il tipo è letteralmente proprio lì. Inoltre, le "battute pazze" non sono rilevanti, il tuo stile preferito aggiunge solo lettere ridondanti in questa stessa riga. Direi che new Type[] {...}è meno leggibile, perché la linea è più lunga e sono informazioni irrilevanti / boilerplate / rumore. Quindi: è una questione di stile e hai iniziato la discussione con un passivo aggressivo "avresti votato verso l'alto, se fosse stato per i miei gusti" ..
Benjamin Podszun

2
Attenzione, non funzionerà se 2 metodi hanno gli stessi nomi, lo stesso numero di parametri e gli stessi tipi di parametri. Sto pensando qui a sovraccarichi di operatori di cast espliciti. Ad esempio public static explicit double(MyType obj)e public static explicit float(MyType obj). Avrai ancora un file AmbiguousMatchException. In questo caso, potresti usare returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))ad esempio.
Guillaume
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.