Уникнення неоднозначного виключення відповідника


115

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

Однак я отримую неоднозначне виняток відповідності, імовірно, тому що існує багато перевантажених методів аналізу Парсе, кожен з яких займає один об'єкт (рядок, int, подвійний і т.д.).

Як я можу бути більш конкретним у виклику свого методу, щоб переконатися, що я досягну правильного методу ( Аналіз (рядок s) ), і виняток не буде кинутий.

Мій код виглядає приблизно так:

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

Відповіді:


193

Використовуйте це перевантаження та використовуйте

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

9
@Bitterblue Мене бентежить, чому ти пишеш цей коментар - і чому ти вважаєш питання стилю варті обговорення?
Бенджамін Подшун

9
Презентація прекрасна, просто трапляється дотримуватися іншого стилю, ніж той, який, здається, ви віддаєте перевагу. Ви прокоментували: "Я б користувався цим сараєм для велосипеда, якби він був трохи синішим". Що мене бентежить. Редагування коментаря: Якщо ви не знаєте, що новий [] {} насправді визначає тип масиву та IS, еквівалентний новому типу [] в цьому випадку? У такому випадку пробачте - я припускав, що ви коментуєте стиль (обидва твори), але потенційно вважаєте, що фрагмент невірний (це не так).
Бенджамін Подшун

1
Дякую за відповідь, хлопці. Щоб зберегти наступного хлопця від неполадок, для типів посилань використовуйте щось подібне: typeof (string) .MakeByRefType ();
BRebey

5
@Bitterblue Я не "молодий", і це впевнено звучить поблажливо. Програміст, який не вміє читати, new [] { typeof(string) }має інші проблеми, ніж підтримка коду. Тип буквально там. Плюс "божевільні однолінійки" не актуальні, ваш улюблений стиль просто додає зайві букви до цієї лінії. Я б стверджував, що new Type[] {...}це менш читається, тому що лінійка довша, і це не має значення інформації / котла / шуму. Отже: справа в стилі, і ви розпочали дискусію з пасивним агресивом: "Я б прихилив, якби це задовольнило мій смак" ..
Бенджамін Подшун

2
Будьте уважні, це не спрацює, якщо 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))наприклад.
Гійом
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.