Evitar una excepción de coincidencia ambigua

115

Estoy invocando un método estático Parse en un tipo a través de la reflexión porque no sé el tipo de objeto en tiempo de compilación (lo sé, sin embargo, tiene un método Parse , tomando una cadena).

Sin embargo, obtengo una excepción de coincidencia ambigua, presumiblemente porque hay muchos métodos Parse sobrecargados , cada uno de los cuales toma un solo objeto (cadena, int, doble, etc.).

¿Cómo puedo ser más específico en la invocación de mi método para asegurarme de que llego al método correcto ( Parse (string s) ) y no se lanza la excepción?

Mi código se ve así:

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

Respuestas:

193

Utilice esta sobrecarga y utilice

returnType.GetMethod("Parse", new [] {typeof(string)})
Benjamin Podszun
fuente
9
@Bitterblue Estoy confundido por qué escribirías ese comentario y por qué consideras que vale la pena discutir cuestiones de estilo.
Benjamin Podszun
9
La presentación está bien, simplemente sigue un estilo diferente al que parece preferir. Comentaste en la línea de "Usaría este cobertizo para bicicletas, si fuera un poco más azulado". Lo que me confunde. Editando el comentario: A menos que no sepa que el nuevo [] {} en realidad infiere el tipo de Array y ES equivalente al nuevo Tipo [] en este caso. En ese caso, lo siento, asumí que comentaste sobre el estilo (ambos funcionan) mientras que potencialmente piensas que el fragmento es incorrecto (no lo es).
Benjamin Podszun
1
Gracias por la respuesta, chicos. Para ahorrarle algunos problemas al siguiente tipo, para tipos de referencia, use algo como esto: typeof (string) .MakeByRefType ();
BRebey
5
@ Bitterblue No soy 'joven' y eso seguro suena condescendiente. Un programador que no puede leer new [] { typeof(string) }tiene otros problemas además de mantener el código. El tipo está literalmente ahí. Además, las 'frases locas' no son relevantes, su estilo preferido solo agrega letras redundantes en esta misma línea. Yo diría que new Type[] {...}es menos legible, porque la línea es más larga y eso es información irrelevante / repetitivo / ruido. Por lo tanto: es una cuestión de estilo y comenzaste la discusión con un pasivo agresivo 'habría votado a favor, si fuera a mi gusto' ..
Benjamin Podszun
2
Tenga cuidado, no funcionará si 2 métodos tienen los mismos nombres, el mismo número de parámetros y los mismos tipos de parámetros. Estoy pensando aquí en sobrecargas explícitas de operadores de transmisión. Por ejemplo public static explicit double(MyType obj)y public static explicit float(MyType obj). Todavía tendrá un AmbiguousMatchException. En este caso, podría utilizar, returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))por ejemplo.
Guillaume