Saya memiliki dua objek dengan tipe yang sama, dan saya ingin mengulang properti publik pada masing-masing objek dan memberi tahu pengguna tentang properti mana yang tidak cocok.
Apakah mungkin melakukan ini tanpa mengetahui properti apa yang dikandung objek?
Jawaban:
Ya, dengan refleksi - dengan asumsi setiap tipe properti mengimplementasikan dengan
Equals
tepat. Alternatifnya adalah menggunakanReflectiveEquals
secara rekursif untuk semua kecuali beberapa tipe yang diketahui, tetapi itu menjadi rumit.sumber
Tentu Anda bisa dengan refleksi. Berikut adalah kode untuk mengambil properti dari jenis yang diberikan.
Jika Anda dapat memberikan lebih banyak info tentang apa yang Anda bandingkan tentang properti, kami dapat mengumpulkan algoritma differing dasar. Kode intstance ini akan berbeda pada nama
sumber
.Select(...)
Saya tahu ini mungkin berlebihan, tapi inilah kelas ObjectComparer saya yang saya gunakan untuk tujuan ini:
sumber
Masalah sebenarnya: Bagaimana cara mendapatkan perbedaan dua set?
Cara tercepat yang saya temukan adalah mengonversi set ke kamus terlebih dahulu, lalu perbeda. Berikut ini pendekatan umum:
Maka Anda dapat melakukan sesuatu seperti ini:
sumber
Iya. Gunakan Refleksi . Dengan Reflection, Anda dapat melakukan hal-hal seperti:
Dan kemudian Anda bisa menggunakan kelas PropertyInfo yang dihasilkan untuk membandingkan semua hal.
sumber
Membandingkan dua objek dengan tipe yang sama menggunakan LINQ dan Reflection. NB! Ini pada dasarnya adalah penulisan ulang solusi dari Jon Skeet, tetapi dengan sintaksis yang lebih ringkas dan modern. Itu juga harus menghasilkan IL sedikit lebih efektif.
Bunyinya seperti ini:
sumber
where !Equals(serverValue, localValue)
denganfirstType.IsValueType ? !Equals(serverValue, localValue) : !ReflectiveEquals(serverValue, localValue)
Type.GetProperties akan mencantumkan masing-masing properti dari jenis yang diberikan. Kemudian gunakan PropertyInfo.GetValue untuk memeriksa nilainya.
sumber
Seperti yang banyak disebutkan pendekatan rekursif, ini adalah fungsi yang Anda bisa berikan nama yang dicari dan properti untuk mulai dengan:
sumber