Apakah ada cara untuk mengetahui apakah event handler telah ditambahkan ke objek? Saya membuat serial daftar objek ke / keluar dari status sesi sehingga kita dapat menggunakan status sesi berbasis SQL ... Ketika sebuah objek dalam daftar memiliki properti yang diubah, ia harus ditandai, yang ditangani oleh pawang sebelum ditangani dengan benar sebelum . Namun sekarang ketika objek deserialized itu tidak mendapatkan pengendali event.
Karena agak kesal, saya baru saja menambahkan event handler ke properti Get yang mengakses objek. Sudah dipanggil sekarang, itu bagus, kecuali dipanggil 5 kali jadi saya pikir pawang terus ditambahkan setiap kali objek diakses.
Benar-benar cukup aman untuk diabaikan begitu saja, tetapi saya lebih suka membuatnya lebih bersih dengan memeriksa untuk melihat apakah pawang telah ditambahkan jadi saya hanya melakukannya sekali.
Apakah itu mungkin?
Suntingan: Saya tidak harus memiliki kontrol penuh atas event handler apa yang ditambahkan, jadi hanya memeriksa null saja tidak cukup.
Jawaban:
Dari luar kelas pendefinisian, seperti @Telos menyebutkan, Anda hanya dapat menggunakan EventHandler di sisi kiri a
+=
atau a-=
. Jadi, jika Anda memiliki kemampuan untuk memodifikasi kelas yang mendefinisikan, Anda bisa memberikan metode untuk melakukan pemeriksaan dengan memeriksa apakah event handlernull
- jika demikian, maka tidak ada event handler yang ditambahkan. Jika tidak, maka mungkin dan Anda dapat mengulangi nilai-nilai di Delegate.GetInvocationList . Jika satu sama dengan delegasi yang ingin Anda tambahkan sebagai pengendali acara, maka Anda tahu itu ada di sana.Dan ini dapat dengan mudah dimodifikasi untuk menjadi "tambahkan pawang jika tidak ada". Jika Anda tidak memiliki akses ke jeroan kelas yang memaparkan acara tersebut, Anda mungkin perlu menjelajah
-=
dan+=
, seperti yang disarankan oleh @Lou Franco.Namun, Anda mungkin sebaiknya memeriksa kembali cara Anda menugaskan dan menonaktifkan objek-objek ini, untuk melihat apakah Anda tidak dapat menemukan cara untuk melacak informasi ini sendiri.
sumber
Delegate.Equals(objA, objB)
jika Anda ingin memeriksa keberadaan delegasi yang sama persis. Jika tidak membandingkan sifat individual sepertiif(objA.Method.Name == objB.Method.Name && objA.Target.GetType().FullName == objB.Target.GetType().FullName)
.Saya baru-baru ini datang ke situasi yang sama di mana saya perlu mendaftarkan pawang untuk suatu peristiwa hanya sekali. Saya menemukan bahwa Anda dapat membatalkan registrasi dengan aman terlebih dahulu, dan kemudian mendaftar lagi, bahkan jika pawang tidak terdaftar sama sekali:
Perhatikan bahwa melakukan hal ini setiap kali Anda mendaftar pawang Anda akan memastikan bahwa pawang Anda terdaftar hanya sekali. Kedengarannya seperti latihan yang cukup bagus untuk saya :)
sumber
Jika ini adalah satu-satunya penangan, Anda dapat memeriksa untuk melihat apakah acara tersebut nol, jika tidak, penangan telah ditambahkan.
Saya pikir Anda dapat dengan aman memanggil - = pada acara dengan handler Anda bahkan jika itu tidak ditambahkan (jika tidak, Anda bisa menangkapnya) - untuk memastikan itu tidak ada di sana sebelum menambahkan.
sumber
Contoh ini menunjukkan cara menggunakan metode GetInvocationList () untuk mengambil delegasi ke semua penangan yang telah ditambahkan. Jika Anda mencari untuk melihat apakah penangan tertentu (fungsi) telah ditambahkan maka Anda dapat menggunakan array.
Anda dapat memeriksa berbagai properti di properti Metode delegasi untuk melihat apakah fungsi tertentu telah ditambahkan.
Jika Anda ingin melihat apakah hanya ada satu lampiran, Anda bisa menguji nol.
sumber
Jika saya memahami masalah Anda dengan benar, Anda mungkin memiliki masalah yang lebih besar. Anda mengatakan bahwa objek lain dapat berlangganan acara ini. Ketika objek serial dan deserialized objek lain (yang Anda tidak memiliki kendali) akan kehilangan event handler mereka.
Jika Anda tidak khawatir tentang hal itu maka menyimpan referensi ke event handler Anda harus cukup baik. Jika Anda khawatir tentang efek samping dari objek lain yang kehilangan event handlernya, maka Anda mungkin ingin memikirkan kembali strategi caching Anda.
sumber
Saya setuju dengan jawaban ALF, tetapi sedikit modifikasi untuk itu adalah, untuk menggunakan,
sumber
Satu-satunya cara yang berhasil bagi saya adalah membuat variabel Boolean yang saya setel ke true ketika saya menambahkan acara. Lalu saya bertanya: Jika variabelnya salah, saya menambahkan acara.
Variabel ini bisa bersifat global.
sumber
sumber