Unikanie niejednoznacznego wyjątku dopasowania

115

Wywołuję metodę statyczną Parse na typie poprzez odbicie, ponieważ nie znam typu obiektu w czasie kompilacji (wiem jednak, że ma metodę Parse , pobierając ciąg).

Jednak otrzymuję niejednoznaczny wyjątek dopasowania, prawdopodobnie dlatego, że istnieje wiele przeciążonych metod analizy , z których każda pobiera pojedynczy obiekt (ciąg, int, double itp.).

W jaki sposób mogę być bardziej szczegółowy w wywołaniu metody, aby upewnić się, że dotarłem do poprawnej metody ( Parse (string s) ) i nie zostanie zgłoszony wyjątek.

Mój kod wygląda tak:

Type returnType = p.PropertyType;
object value = returnType.GetMethod("Parse").Invoke(null, new string[] { "1" });
Ben Aston
źródło

Odpowiedzi:

193

Użyj tego przeciążenia i użyj

returnType.GetMethod("Parse", new [] {typeof(string)})
Benjamin Podszun
źródło
9
@Bitterblue Nie wiem, dlaczego piszesz ten komentarz - i dlaczego uważasz, że kwestie stylu warto omówić?
Benjamin Podszun
9
Prezentacja jest w porządku, po prostu ma inny styl niż ten, który preferujesz. Skomentowałeś w ten sposób: „Użyłbym tej szopy na rowery, gdyby była nieco bardziej niebieska”. Co mnie wprawia w zakłopotanie. Edytowanie komentarza: Chyba że nie jesteś świadomy tego, że new [] {} faktycznie wnioskuje o typ tablicy i JEST odpowiednikiem nowego Type [] w tym przypadku? W takim razie przepraszam - założyłem, że komentujesz styl (oba działają), potencjalnie myśląc, że fragment jest zły (tak nie jest).
Benjamin Podszun
1
Dzięki za odpowiedź, chłopaki. Aby zaoszczędzić następnemu facetowi trochę kłopotów, dla typów referencyjnych użyj czegoś takiego: typeof (string) .MakeByRefType ();
BRebey
5
@Bitterblue Nie jestem „młody” i to z pewnością brzmi protekcjonalnie. Programista, który nie potrafi czytać, new [] { typeof(string) }ma inne problemy niż konserwacja kodu. Ten typ jest dosłownie tam. Poza tym „szalone jednolinijki” nie są istotne, twój preferowany styl po prostu dodaje zbędne litery do tej samej linii. Twierdzę, że new Type[] {...}jest to mniej czytelne, ponieważ wiersz jest dłuższy, a to nieistotne informacje / schemat / szum. Stąd: to kwestia stylu, a dyskusję rozpocząłeś od pasywnej agresji „zagłosowałbyś za, gdyby pasował do mojego gustu” ..
Benjamin Podszun
2
Uważaj, nie zadziała, jeśli dwie metody mają takie same nazwy, taką samą liczbę parametrów i te same typy parametrów. Myślę tutaj o jawnych przeciążeniach operatorów rzutowania. Na przykład public static explicit double(MyType obj)i public static explicit float(MyType obj). Nadal będziesz mieć AmbiguousMatchException. W takim przypadku możesz użyć returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))na przykład.
Guillaume,