Saya ingin menetapkan properti objek melalui Refleksi, dengan nilai tipe string
. Jadi, misalnya, anggaplah saya memiliki Ship
kelas, dengan properti Latitude
, yang adalah a double
.
Inilah yang ingin saya lakukan:
Ship ship = new Ship();
string value = "5.5";
PropertyInfo propertyInfo = ship.GetType().GetProperty("Latitude");
propertyInfo.SetValue(ship, value, null);
Seperti, ini melempar ArgumentException
:
Objek bertipe 'System.String' tidak dapat dikonversi ke tipe 'System.Double'.
Bagaimana saya bisa mengkonversi nilai ke tipe yang tepat, berdasarkan propertyInfo
?
c#
reflection
type-conversion
propertyinfo
setvalue
David Hodgson
sumber
sumber
Jawaban:
Anda dapat menggunakan
Convert.ChangeType()
- Ini memungkinkan Anda untuk menggunakan informasi runtime padaIConvertible
jenis apa pun untuk mengubah format representasi. Namun, tidak semua konversi mungkin, dan Anda mungkin perlu menulis logika kasus khusus jika Anda ingin mendukung konversi dari jenis yang tidakIConvertible
.Kode yang sesuai (tanpa penanganan pengecualian atau logika kasus khusus) adalah:
sumber
TryChangeType
atauCanChangeType
?Seperti yang beberapa orang lain katakan, Anda ingin menggunakan
Convert.ChangeType
:Bahkan, saya sarankan Anda melihat seluruh
Convert
Kelas .Kelas ini, dan banyak kelas berguna lainnya adalah bagian dari
System
Namespace . Saya merasa berguna untuk memindai namespace itu setiap tahun atau lebih untuk melihat fitur apa yang saya lewatkan. Cobalah!sumber
Saya perhatikan banyak orang merekomendasikan
Convert.ChangeType
- Ini berfungsi untuk beberapa kasus namun segera setelah Anda mulai melibatkannullable
jenis Anda akan mulai menerimaInvalidCastExceptions
:Sebuah pembungkus ditulis beberapa tahun yang lalu untuk menangani ini tetapi itu juga tidak sempurna.
sumber
Saya mencoba jawaban dari LBushkin dan itu berhasil, tetapi itu tidak akan berfungsi untuk nilai nol dan bidang nullable. Jadi saya sudah mengubahnya menjadi ini:
sumber
Anda dapat menggunakan konverter tipe (tidak ada pengecekan error):
Dalam hal mengatur kode, Anda dapat membuat sejenis mixin yang akan menghasilkan kode seperti ini:
Ini akan dicapai dengan kode ini:
MPropertyAsStringSettable
dapat digunakan kembali untuk berbagai kelas.Anda juga dapat membuat konverter tipe khusus untuk dilampirkan ke properti atau kelas Anda:
sumber
object
?object
akan menambahkan metode ekstensi ke semua kelas, yang umumnya tidak diinginkan.Anda mungkin mencari
Convert.ChangeType
metodenya. Sebagai contoh:sumber
Menggunakan
Convert.ChangeType
dan mendapatkan jenis yang akan dikonversi dari menuPropertyInfo.PropertyType
.sumber
Saya akan menjawab ini dengan jawaban umum. Biasanya jawaban ini tidak bekerja dengan panduan. Ini adalah versi yang berfungsi dengan panduan juga.
sumber
Atau Anda dapat mencoba:
sumber
Jika Anda menulis aplikasi Metro, Anda harus menggunakan kode lain:
catatan:
dari pada
sumber
Menggunakan kode berikut akan menyelesaikan masalah Anda:
sumber
Apakah Anda ingin bermain-main dengan Reflection atau Anda ingin membuat perangkat lunak produksi? Saya akan mempertanyakan mengapa Anda menggunakan refleksi untuk menetapkan properti.
sumber
GenericProgramming.exe:ReflectionBenefits()
)