Как избежать неоднозначного совпадения

116

Я вызываю статический метод Parse для типа через отражение, потому что я не знаю тип объекта во время компиляции (но я знаю, что у него есть метод Parse , принимающий строку).

Однако я получаю исключение неоднозначного совпадения, предположительно потому, что существует много перегруженных методов Parse, каждый из которых принимает один объект (string, int, double и т. Д.).

Как я могу быть более конкретным при вызове моего метода, чтобы гарантировать, что я достигну правильного метода ( Parse (string s) ), и исключение не будет создано.

Мой код выглядит так:

Type returnType = p.PropertyType;
object value = returnType.GetMethod("Parse").Invoke(null, new string[] { "1" });
Бен Астон
источник

Ответы:

194

Используйте эту перегрузку и используйте

returnType.GetMethod("Parse", new [] {typeof(string)})
Бенджамин Подсзун
источник
9
@Bitterblue Я не понимаю, почему вы написали этот комментарий - и почему вы считаете, что вопросы стиля заслуживают обсуждения?
Benjamin Podszun
9
Презентация прекрасна, просто так получилось, что стиль ее отличается от того, который вы предпочитаете. Вы прокомментировали это примерно так: «Я бы использовал этот навес для велосипедов, если бы он был более голубоватым». Что меня смущает. Редактирование комментария: Если вы не знаете, что new [] {} фактически определяет тип массива и в данном случае ЕСТЬ эквивалентен new Type []? В этом случае извините - я предполагал, что вы комментируете стиль (оба работают), потенциально думая, что фрагмент неверен (это не так).
Benjamin Podszun
1
Спасибо за ответ, ребята. Чтобы избавить следующего парня от неприятностей, для ссылочных типов используйте что-то вроде этого: typeof (string) .MakeByRefType ();
BRebey
5
@Bitterblue Я не «молодой», и это определенно звучит снисходительно. У программиста, который не умеет читать, new [] { typeof(string) }есть другие проблемы, кроме поддержки кода. Буквально тут типаж. Плюс «сумасшедшие однострочные» слова неуместны, ваш предпочтительный стиль просто добавляет лишние буквы в эту самую строку. Я бы сказал, что new Type[] {...}это менее читабельно, потому что строка длиннее и это неактуальная информация / шаблон / шум. Следовательно: это вопрос стиля, и вы начали обсуждение с пассивно-агрессивного «проголосовали бы за, если бы это соответствовало моему вкусу» ..
Бенджамин
2
Будьте осторожны, это не сработает, если у двух методов одинаковые имена, одинаковое количество параметров и одинаковые типы параметров. Я думаю здесь о перегрузках явных операторов приведения. Например public static explicit double(MyType obj)и public static explicit float(MyType obj). У вас по-прежнему будет AmbiguousMatchException. В этом случае вы можете, returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))например, использовать .
Гийом