Pertanyaan .NET (C #) events - pertanyaan EventArgs kustom


Saya memiliki sejumlah peristiwa khusus C # yang terkait dengan item yang dipilih di pohon dan kemudian menu konteks yang digunakan untuk memicu beberapa tindakan pada item yang dipilih. Saya mulai membuat kelas berbasis EventArgs terpisah untuk setiap peristiwa khusus, untuk mengemas data yang diperlukan untuk acara tersebut.

Namun, dalam penglihatan-belakang, saya menyadari bahwa sebagian besar (mungkin semua) dari peristiwa adat saya harus lulus paling tidak daftar objek yang mendasari diwakili oleh pemilihan pohon. Beberapa acara kemungkinan akan membutuhkan data tambahan juga.

Dengan itu dalam pikiran, saya bertanya-tanya apakah salah satu dari berikut ini adalah praktik yang dapat diterima?

  • Gunakan kelas berbasis EventArgs kustom yang sama untuk beberapa acara (yang hanya membutuhkan daftar objek untuk dilewatkan). Jelas, itu harus bekerja, tetapi tampaknya melepaskan diri dari beberapa konvensi penamaan yang direkomendasikan digunakan untuk memasang kabel mesin acara.

  • Buat kelas dasar yang merangkum daftar objek yang sering saya perlukan, dan kemudian memperoleh kelas tambahan darinya sebagai data tambahan yang diperlukan.

  • Mungkin sesuatu yang lain sama sekali?

Saat ini, saya hanya memiliki beberapa acara khusus, tetapi perlu menambahkan lebih banyak. Karena saya melihat pola yang muncul berkaitan dengan data yang dibutuhkan oleh setiap peristiwa, saya ingin memiliki rencana yang lebih baik sebelum melanjutkan.

Terima kasih atas sarannya.


5
2018-02-03 16:36


asal


Jawaban:


Saya sudah pernah melakukan jalan ini sebelumnya. Saya pergi dengan ide kedua Anda memiliki kelas acara dasar yang membungkus data umum. Jika tidak ada peristiwa yang akan langsung menggunakannya, buat kelas dasar internal untuk menghindari mengekspos objek yang tidak perlu kepada pengguna. Memiliki kelas dasar juga memungkinkan Anda menambahkan lebih banyak data acara di lain waktu. Karena kelas bersifat internal, pengguna dari luar tidak terpengaruh oleh perubahan.


5
2018-02-03 16:45



Ada banyak contoh ini dalam kerangka .NET. Akan sangat konsisten untuk melakukan sesuatu sepanjang garis yang sama. Berikut ini beberapa:

  • System.ComponentModel.ProgressChangedEventArgs (menyediakan ProgressPercentage dan UserState untuk jenis turunan)
    • System.Net.DownloadProgressChangedEventArgs
    • System.Net.UploadProgressChangedEventArgs
    • System.Windows.Documents.Serialization.WritingProgressChangedEventArgs
  • System.ComponentModel.CancelEventArgs (menyediakan Membatalkan anggota untuk jenis turunan)
    • Microsoft.VisualBasic.ApplicationServices.StartupEventArgs
    • System.ComponentModel.DoWorkEventArgs
    • System.Configuration.SettingChangingEventArgs
    • System.Drawing.Printing.PrintEventArgs
    • System.Web.UI.WebControls.DetailsViewDeleteEventArgs
    • System.Web.UI.WebControls.DetailsViewInsertEventArgs
    • System.Web.UI.WebControls.DetailsViewModeEventArgs
    • System.Web.UI.WebControls.DetailsViewPageEventArgs
    • System.Web.UI.WebControls.DetailsViewUpdateEventArgs
    • System.Web.UI.WebControls.EntityDataSourceChangingEventArgs
    • Secara harfiah 50 lebih dari ini

Edit:

Saya mungkin menggunakan kelas seperti ini (tidak abstrak).

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

public class CollectionEventArgs<T> : EventArgs
{
    public static readonly CollectionEventArgs<T> Empty = new CollectionEventArgs<T>();

    public CollectionEventArgs(params T[] items)
    {
        this.Items = new ReadOnlyCollection<T>(items);
    }

    public CollectionEventArgs(IEnumerable<T> items)
    {
        this.Items = new ReadOnlyCollection<T>(items.ToArray());
    }

    public ReadOnlyCollection<T> Items
    {
        get;
        private set;
    }
}

3
2018-02-08 19:48



Saya akan pergi untuk satu dan dua. Buat kelas dasar yang dapat Anda gunakan untuk sebagian besar acara Anda dan kemudian turunkan dari kelas tersebut untuk acara yang membutuhkan sesuatu yang lain. Jika Anda melihat. NET perpustakaan itu cara mereka telah dibangun.

Pastikan saja Anda menggunakan konvensi penamaan yang tepat. Kelas dasar tidak boleh menyertakan nama acara tertentu, hanya kelas yang digunakan hanya dalam satu acara harus merujuk nama acara. Kelas dasar mungkin akan menyertakan nama kontrol Anda.


1
2018-02-03 16:44



Maksudmu sesuatu seperti

public class EventArgs<TValue> : EventArgs
{
    public TValue Value { get; }

    /* ... */
}

?

Di mana saya bisa menggunakan sebagai Value apapun yang aku suka?

Ya, saya dengan senang hati menggunakan hal seperti itu. Saya tidak berpikir itu masalah.


1
2018-02-03 16:44