Menghindari pengecualian kecocokan yang ambigu

115

Saya menggunakan metode Parse statis pada tipe melalui refleksi karena saya tidak tahu jenis objek pada waktu kompilasi (saya tahu, bagaimanapun, ia memiliki metode Parse , mengambil string).

Namun, saya mendapatkan pengecualian pertandingan yang ambigu, mungkin karena ada banyak metode Parse yang kelebihan beban, masing-masing mengambil satu objek (string, int, double, dll.).

Bagaimana saya bisa lebih spesifik dalam pemanggilan metode saya untuk memastikan saya mencapai metode yang benar ( Parse (string s) ) dan pengecualian tidak dilemparkan.

Kode saya terlihat seperti ini:

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

Jawaban:

193

Gunakan kelebihan beban ini dan gunakan

returnType.GetMethod("Parse", new [] {typeof(string)})
Benjamin Podszun
sumber
9
@ Bitterblue Saya bingung mengapa Anda menulis komentar itu - dan mengapa Anda menganggap masalah gaya perlu dibahas?
Benjamin Podszun
9
Presentasinya bagus, kebetulan mengikuti gaya yang berbeda dari yang Anda sukai. Anda berkomentar di sepanjang baris "Saya akan menggunakan gudang sepeda ini, jika sedikit lebih kebiruan". Yang membuatku bingung. Mengedit komentar: Kecuali Anda tidak menyadari bahwa [] {} baru sebenarnya menyimpulkan tipe Array dan IS yang setara dengan Tipe baru [] dalam kasus ini? Dalam hal ini, saya minta maaf - saya berasumsi bahwa Anda mengomentari gaya (keduanya berfungsi) sementara berpotensi berpikir bahwa potongannya salah (sebenarnya tidak).
Benjamin Podszun
1
Terima kasih atas jawabannya, guys. Untuk menyelamatkan orang berikutnya beberapa masalah, untuk tipe referensi, gunakan sesuatu seperti ini: typeof (string) .MakeByRefType ();
BRebey
5
@ Bitterblue Saya tidak 'muda' dan itu pasti terdengar merendahkan. Seorang programmer yang tidak bisa membaca new [] { typeof(string) }memiliki masalah lain selain memelihara kode. Jenisnya secara harfiah ada di sana. Ditambah 'satu baris gila' tidak relevan, gaya pilihan Anda hanya menambahkan huruf yang berlebihan ke dalam baris ini. Saya berpendapat itu new Type[] {...}kurang dapat dibaca, karena garisnya lebih panjang dan itu adalah informasi / boilerplate / noise yang tidak relevan. Karenanya: Ini masalah gaya dan Anda memulai diskusi dengan pasif agresif 'akan mendapat suara positif, jika itu sesuai dengan selera saya' ..
Benjamin Podszun
2
Hati-hati, ini tidak akan berhasil jika 2 metode memiliki nama yang sama, jumlah parameter yang sama, dan jenis parameter yang sama. Di sini saya berpikir tentang kelebihan operator pemeran eksplisit. Misalnya public static explicit double(MyType obj)dan public static explicit float(MyType obj). Anda masih akan memiliki file AmbiguousMatchException. Dalam hal ini, Anda bisa menggunakan returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))misalnya.
Guillaume