Refleksi terutama pada anggota pribadi adalah salah
- Refleksi merusak keamanan jenis. Anda dapat mencoba memanggil metode yang tidak ada (lagi), atau dengan parameter yang salah, atau dengan terlalu banyak parameter, atau tidak cukup ... atau bahkan dalam urutan yang salah (yang ini favorit saya :)). Omong-omong tipe pengembalian bisa berubah juga.
- Refleksi lambat.
Refleksi anggota pribadi melanggar prinsip enkapsulasi dan dengan demikian mengekspos kode Anda sebagai berikut:
- Tingkatkan kompleksitas kode Anda karena harus menangani perilaku batin kelas. Apa yang disembunyikan harus tetap disembunyikan.
- Membuat kode Anda mudah rusak karena akan dikompilasi tetapi tidak akan berjalan jika metode ini mengubah namanya.
- Membuat kode pribadi mudah dipecah karena jika bersifat pribadi itu tidak dimaksudkan untuk dipanggil dengan cara itu. Mungkin metode pribadi mengharapkan keadaan batin sebelum dipanggil.
Bagaimana jika saya tetap harus melakukannya?
Ada beberapa kasus, ketika Anda bergantung pada pihak ketiga atau Anda perlu beberapa api tidak terbuka, Anda harus melakukan beberapa refleksi. Beberapa juga menggunakannya untuk menguji beberapa kelas yang mereka miliki tetapi mereka tidak ingin mengubah antarmuka untuk memberikan akses ke anggota dalam hanya untuk tes.
Jika Anda melakukannya, lakukan dengan benar
Untuk memitigasi masalah yang mudah pecah, yang terbaik adalah mendeteksi potensi jeda dengan menguji dalam unit test yang akan berjalan dalam bentuk integrasi berkelanjutan atau semacamnya. Tentu saja, itu berarti Anda selalu menggunakan majelis yang sama (yang berisi anggota pribadi). Jika Anda menggunakan beban dinamis dan refleksi, Anda suka bermain dengan api, tetapi Anda selalu dapat menangkap Pengecualian bahwa panggilan dapat menghasilkan.
- Mengurangi kelambatan refleksi:
Dalam versi terbaru dari .Net Framework, CreateDelegate dikalahkan oleh faktor 50 yang dipanggil MethodInfo:
// The following should be done once since this does some reflection
var method = this.GetType().GetMethod("Draw_" + itemType,
BindingFlags.NonPublic | BindingFlags.Instance);
// Here we create a Func that targets the instance of type which has the
// Draw_ItemType method
var draw = (Func<TInput, Output[]>)_method.CreateDelegate(
typeof(Func<TInput, TOutput[]>), this);
draw
panggilan akan menjadi sekitar 50x lebih cepat daripada MethodInfo.Invoke
digunakan draw
sebagai standar Func
seperti itu:
var res = draw(methodParams);
Periksa pos saya ini untuk melihat patokan pada pemanggilan metode yang berbeda