metode setvalue untuk properti tidak dapat ditemukan [duplikat]
Saya mencoba menemukan cara untuk mengulang melalui semua bidang di objek apa pun.
Pertama saya mencoba menggunakan proyeksi untuk mendapatkan bidang nilai dan mencetaknya, ini bekerja dengan baik:
var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };
foreach (PropertyInfo property in ob.GetType().GetProperties())
{
Console.WriteLine(property.Name + " val " + property.GetValue(ob));
}
Namun tentu saja, saya ingin menyetel bidang ke beberapa nilai baru, jadi setelah membacanya, sepertinya ini akan berfungsi:
foreach (PropertyInfo property in ob.GetType().GetProperties())
{
property.SetValue(ob,"new String");
}
Ini memberi saya "metode set properti tidak ditemukan". Saya juga mencoba memberikan null sebagai argumen, yang dilakukan di beberapa tempat:
property.SetValue(ob,"new String",null);
Ini memiliki hasil yang sama. Mengapa ini gagal pada saya?
EDIT: Telah ditunjukkan kepada saya bahwa saya belum cukup menggambarkan tujuan saya. Seperti yang dinyatakan di atas, tujuannya adalah untuk melakukan iterasi melalui bidang di objek apa pun, seperti objek contoh ini:
var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };
Dan juga di pertanyaan awal, saya menulis "Saya ingin menyetel bidang ke beberapa nilai baru" ini berarti saya ingin mengulang melalui bidang di objek "ob", dan menyetelnya ke nilai baru.
Terima kasih
Jawaban
Mengapa ini gagal pada saya?
Untuk alasan yang sama menulis
ob.DeclarativeSecn = "new value";
akan gagal pada waktu kompilasi, setidaknya untuk contoh yang Anda berikan. Objek Anda adalah tipe anonim, dan properti pada tipe anonim hanya memiliki getter - properti tidak mengizinkan Anda menyetel nilai baru untuk properti. Jika Anda ingin dapat mengubah properti setelah itu, jangan gunakan tipe anonim.
Perhatikan bahwa pertanyaan Anda berbicara tentang pengulangan properti objek apa pun , tetapi:
- Saat mencetak, Anda mengasumsikan bahwa semua properti memiliki getter; itu umumnya benar, tetapi tidak selalu
- Saat menyetel nilai baru, Anda mengasumsikan bahwa semua properti memiliki getter dan itu adalah properti string
Tak satu pun dari asumsi tersebut benar secara umum . Jadi, jika Anda ingin dapat menangani objek apa pun , Anda perlu menambahkan lebih banyak pemeriksaan.
Tipe anonim menyediakan cara mudah untuk merangkum sekumpulan properti hanya-baca menjadi satu objek tanpa harus secara eksplisit mendefinisikan tipe terlebih dahulu.
Penekanan milikku.
Tampaknya Anda tidak dapat menetapkan nilai pada properti hanya-baca. Kedengarannya masuk akal.