Evitando uma exceção de correspondência ambígua

115

Estou invocando um método estático Parse em um tipo via reflexão porque não sei o tipo do objeto em tempo de compilação (eu sei, no entanto, ele tem um método Parse , pegando uma string).

No entanto, estou recebendo uma exceção de correspondência ambígua, presumivelmente porque há muitos métodos do Parse sobrecarregados , cada um tomando um único objeto (string, int, double etc.).

Como posso ser mais específico na invocação de meu método para garantir que alcancei o método correto ( Parse (string s) ) e a exceção não é lançada.

Meu código é parecido com este:

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

Respostas:

193

Use esta sobrecarga e use

returnType.GetMethod("Parse", new [] {typeof(string)})
Benjamin Podszun
fonte
9
@Bitterblue Estou confuso por que você escreveu esse comentário - e por que você considera questões de estilo que valem a pena discutir?
Benjamin Podszun
9
A apresentação é boa, mas segue um estilo diferente do que você parece preferir. Você comentou algo como "Eu usaria este galpão de bicicletas, se fosse um pouco mais azulado". O que me confunde. Editando o comentário: A menos que você não saiba que new [] {} realmente infere o tipo de Array e é equivalente a new Type [] neste caso? Nesse caso, sinto muito - presumi que você comentasse sobre o estilo (ambos funcionam) enquanto potencialmente pensava que o snippet está errado (não é).
Benjamin Podszun
1
Obrigado pela resposta, pessoal. Para evitar problemas ao próximo, para tipos de referência, use algo assim: typeof (string) .MakeByRefType ();
BRebey
5
@Bitterblue Não sou 'jovem' e isso soa condescendente. Um programador que não consegue ler new [] { typeof(string) }tem outros problemas além de manter o código. O tipo está literalmente bem ali. Além disso, 'linhas malucas' não são relevantes, seu estilo preferido apenas adiciona letras redundantes nesta mesma linha. Eu diria que new Type[] {...}é menos legível, porque a linha é mais longa e isso é informação / clichê / ruído irrelevante. Portanto: É uma questão de estilo e você iniciou a discussão com um passivo agressivo 'teria votado positivamente, se atendesse ao meu gosto' ..
Benjamin Podszun
2
Tenha cuidado, não funcionará se 2 métodos tiverem os mesmos nomes, o mesmo número de parâmetros e os mesmos tipos de parâmetros. Estou pensando aqui em sobrecargas de operadores de elenco explícito. Por exemplo public static explicit double(MyType obj)e public static explicit float(MyType obj). Você ainda terá um AmbiguousMatchException. Neste caso, você pode usar, returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))por exemplo.
Guillaume