Saya ingin mengonversi string ke nilai properti objek, yang namanya saya miliki sebagai string. Saya mencoba melakukan ini seperti ini:
string modelProperty = "Some Property Name";
string value = "SomeValue";
var property = entity.GetType().GetProperty(modelProperty);
if (property != null) {
property.SetValue(entity,
Convert.ChangeType(value, property.PropertyType), null);
}
Masalahnya adalah ini gagal dan melempar Pengecualian Cast Tidak Valid ketika tipe properti adalah tipe nullable. Ini bukan kasus dari nilai-nilai yang tidak dapat Dikonversi - nilai-nilai itu akan berfungsi jika saya melakukan ini secara manual (misalnya DateTime? d = Convert.ToDateTime(value);
) Saya telah melihat beberapa pertanyaan serupa tetapi masih tidak dapat membuatnya berfungsi.
c#
.net
reflection
iboeno
sumber
sumber
Jawaban:
Belum diuji, tetapi mungkin sesuatu seperti ini akan berfungsi:
sumber
(value == null) ? null
digunakan(value == null) ? default(t)
?safeValue
variabel yang bertentangan dengan hanya menugaskan kembalivalue
?Anda harus mendapatkan tipe yang mendasarinya untuk melakukan itu ...
Coba ini, saya berhasil menggunakannya dengan obat generik:
Saya menggunakannya di sejumlah tempat dalam kode saya, salah satu contohnya adalah metode pembantu yang saya gunakan untuk mengonversi nilai database dengan cara typesafe:
Disebut menggunakan:
Saya menulis serangkaian posting blog termasuk ini di http://www.endswithsaurus.com/2010_07_01_archive.html (Gulir ke bawah ke Addendum, @JohnMacintyre benar-benar melihat bug dalam kode asli saya yang membawa saya ke jalan yang sama dengan Anda sekarang). Saya memiliki beberapa modifikasi kecil karena posting yang mencakup konversi jenis enum juga jadi jika properti Anda adalah Enum Anda masih dapat menggunakan metode panggilan yang sama. Cukup tambahkan baris untuk memeriksa jenis enum dan Anda pergi ke balapan menggunakan sesuatu seperti:
Biasanya Anda akan memiliki beberapa kesalahan memeriksa atau menggunakan TryParse bukan Parse, tetapi Anda mendapatkan gambarnya.
sumber
Ini agak panjang-ish untuk contoh, tapi ini adalah pendekatan yang relatif kuat, dan memisahkan tugas casting dari nilai yang tidak diketahui ke tipe yang tidak diketahui
Saya memiliki metode TryCast yang melakukan sesuatu yang serupa, dan memperhitungkan jenis yang dapat dibatalkan.
Tentu saja TryCast adalah Metode dengan Tipe Parameter, jadi untuk menyebutnya secara dinamis, Anda harus membuat sendiri MethodInfo:
Kemudian untuk menetapkan nilai properti aktual:
Dan metode ekstensi untuk berurusan dengan properti. Dapat Menandai Nilai ...
sumber
Saya memiliki kebutuhan yang sama, dan jawaban dari LukeH menunjuk ke arah saya. Saya datang dengan fungsi generik ini untuk membuatnya mudah.
Penggunaannya seperti ini:
Perhatikan bahwa parameter kedua hanya digunakan sebagai prototipe untuk menunjukkan fungsi cara melemparkan nilai kembali, sehingga sebenarnya tidak harus menjadi properti tujuan. Berarti Anda dapat melakukan juga melakukan sesuatu seperti ini:
Saya melakukannya dengan cara ini daripada menggunakan keluar karena Anda tidak dapat menggunakan dengan properti. Seperti itu, ia dapat bekerja dengan properti dan variabel. Anda juga bisa membuat overload untuk meneruskan jenisnya jika Anda mau.
sumber
Terima kasih @ Lukas
saya sedikit berubah:
sumber
Saya melakukannya dengan cara ini
sumber