Kadang-kadang ketika membaca kode C # orang lain saya melihat metode yang akan menerima beberapa nilai enum dalam satu parameter. Saya selalu berpikir itu rapi, tetapi tidak pernah memeriksanya.
Nah, sekarang saya pikir saya mungkin membutuhkannya, tetapi tidak tahu bagaimana caranya
- mengatur tanda tangan metode untuk menerima ini
- bekerja dengan nilai-nilai dalam metode
- tentukan enumnya
untuk mencapai hal semacam ini.
Dalam situasi khusus saya, saya ingin menggunakan System.DayOfWeek, yang didefinisikan sebagai:
[Serializable]
[ComVisible(true)]
public enum DayOfWeek
{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6
}
Saya ingin dapat meneruskan satu atau lebih nilai DayOfWeek ke metode saya. Apakah saya dapat menggunakan enum khusus ini sebagaimana adanya? Bagaimana saya melakukan 3 hal yang tercantum di atas?
Jawaban:
Saat Anda menentukan enum, cukup atributkan dengan [Flags], setel nilai ke pangkat dua, dan cara ini akan berfungsi.
Tidak ada lagi yang berubah, selain meneruskan beberapa nilai ke dalam suatu fungsi.
Sebagai contoh:
Untuk lebih jelasnya, lihat dokumentasi MSDN tentang Jenis Enumerasi .
Edit sebagai tanggapan atas penambahan pertanyaan.
Anda tidak akan dapat menggunakan enum itu sebagaimana adanya, kecuali Anda ingin melakukan sesuatu seperti meneruskannya sebagai array / collection / params array. Itu akan membiarkan Anda memberikan banyak nilai. Sintaks flags membutuhkan Enum untuk dispesifikasikan sebagai flag (atau untuk mengubah bahasa dengan cara yang tidak didesain).
sumber
Saya pikir solusi yang lebih elegan adalah dengan menggunakan HasFlag ():
sumber
DaysOfWeek days = new DaysOfWeek(); if (cbTuesday.Checked) days |= DaysOfWeek.Tuesday; if (cbWednesday.Checked) days |= DaysOfWeek.Wednesday;
...Aku mendukung jawaban Reed. Namun, saat membuat enum, Anda harus menentukan nilai untuk setiap anggota enum sehingga membuat semacam bidang bit. Sebagai contoh:
sumber
Anda tidak dapat menggunakan System.DayOfWeek sebagai
[Flags]
enumerasi karena Anda tidak memiliki kendali atasnya. Jika Anda ingin memiliki metode yang menerima beberapaDayOfWeek
maka Anda harus menggunakanparams
kata kunciJika tidak, Anda dapat membuat
[Flags]
enumerasi Anda sendiri seperti yang dijelaskan oleh banyak responden lain dan menggunakan perbandingan bitwise.sumber
Anda harus menentukan angkanya, dan menaikkannya seperti ini karena ini menyimpan nilai dengan cara yang sedikit bijak.
Kemudian tentukan saja metode Anda untuk mengambil enum ini
dan menyebutnya lakukan sesuatu seperti
Untuk memeriksa apakah salah satu nilai enum disertakan, periksa menggunakan operasi bitwise seperti
sumber
panggil metode dalam format ini
MethodName (DaysOfWeek.Tuesday | DaysOfWeek.Thursday);
Menerapkan metode EnumToArray untuk meneruskan opsi
sumber
Tandai enum Anda dengan atribut [Flags]. Juga pastikan bahwa semua nilai Anda saling eksklusif (dua nilai tidak dapat berjumlah sama dengan yang lain) seperti 1,2,4,8,16,32,64 dalam kasus Anda
Saat Anda memiliki metode yang menerima enum DayOfWeek, gunakan bitwise atau operator (|) untuk menggunakan banyak anggota secara bersamaan. Sebagai contoh:
Untuk memeriksa apakah parameter berisi anggota tertentu, gunakan bitwise dan operator (&) dengan anggota yang Anda periksa.
sumber
Reed Copsey benar dan saya akan menambahkan ke posting asli jika saya bisa, tetapi saya tidak bisa jadi saya harus membalas sebagai gantinya.
Berbahaya hanya menggunakan [Bendera] di enum lama mana pun. Saya percaya Anda harus secara eksplisit mengubah nilai enum menjadi pangkat dua saat menggunakan bendera, untuk menghindari bentrokan nilai. Lihat pedoman untuk FlagsAttribute dan Enum .
sumber
Dengan bantuan jawaban yang diposting dan ini:
Saya merasa saya memahaminya dengan cukup baik.
Terima kasih.
sumber
Sesuatu seperti ini seharusnya menunjukkan apa yang Anda cari:
sumber