Saya memiliki kelas yang disebut Questions
(jamak). Di kelas ini ada enum yang disebut Question
(tunggal) yang terlihat seperti ini.
public enum Question
{
Role = 2,
ProjectFunding = 3,
TotalEmployee = 4,
NumberOfServers = 5,
TopBusinessConcern = 6
}
Di Questions
kelas saya memiliki get(int foo)
fungsi yang mengembalikan Questions
objek untuk itu foo
. Apakah ada cara mudah untuk mendapatkan nilai integer dari enum sehingga saya bisa melakukan sesuatu seperti ini Questions.Get(Question.Role)
?
get(int foo)
Anda karena Anda dapat mendefinisikannyaget(Question foo)
saat melakukan casting di dalam metode, Anda dapat memanggil metode Anda sebagaiQuestions.Get(Question.Role)
Jawaban:
Cukup masukkan enum, mis
Hal di atas akan berfungsi untuk sebagian besar enum yang Anda lihat di alam liar, seperti tipe yang mendasari standar untuk enum
int
.Namun, seperti yang ditunjukkan cecilphillip , enum dapat memiliki tipe yang berbeda. Jika enum dinyatakan sebagai
uint
,long
, atauulong
, harus dilemparkan dengan jenis enum; misalnya untukkamu harus menggunakan
sumber
enum Test { Item = 1 }
dan melihat bahwa1 == (int)Test.Item
itu sama.(int)Test.Item
Itu pemain! () adalah operator pemeran eksplisit.enum Question
tidakint
tetapi paralong
pemain ini akan memotongRole
nilai integral s!Enum
sebagai parameter, Anda tahu hanya sejumlah tetap nilai integral yang bisa Anda dapatkan. Di sisi lain, jika Anda hanya mengambilint
, maka Anda harus memvalidasi jika ituint
dalam nilai yang diterima., Sehingga menyulitkan kode. Anda selalu dapat mengganti tanda tangan Anda seperti `` `public void MyMethod (int x) {// melakukan sesuatu dengan x} public void MyMethod (Enum x) {this.MyMethod ((int) x); } `` ``Sejak Enum dapat menjadi semua jenis terpisahkan (
byte
,int
,short
, dll), cara yang lebih kuat untuk mendapatkan nilai integral yang mendasari enum akan memanfaatkanGetTypeCode
metode dalam hubungannya denganConvert
kelas:Ini harus bekerja terlepas dari tipe integral yang mendasarinya.
sumber
var
tipeobject
, jadi Anda perlu membuka kotaknya dan itu menjadi berantakan daripada yang saya inginkan.object val = Convert...etc
paravar
dalam contoh Anda akan selaluobject
.Deklarasikan sebagai kelas statis yang memiliki konstanta publik:
Dan kemudian Anda dapat referensi sebagai
Question.Role
, dan selalu mengevaluasi keint
atau apa pun yang Anda definisikan sebagai.sumber
static readonly int
karena konstanta dikompilasi ke dalam nilai kerasnya. Lihat stackoverflow.com/a/755693/492const
dan bukanstatic readonly
karena setiap kali Anda membandingkanstatic readonly
Anda membuat panggilan metode untuk mendapatkan nilai variabel sedangkan denganconst
Anda membandingkan dua tipe nilai secara langsung.compilation limitation
maksud saya bahwa nilainya adalah hard-coded ketika Anda mengkompilasinya sehingga setiap perubahan pada nilai tersebut akan mengharuskan semua majelis yang menggunakannya perlu dikompilasi ulang. Saya cenderung setuju dengan Anda tentang penggunaan karena mengubah nilai akan memiliki implikasi yang luas.Akan menghasilkan
value == 2
.sumber
Pada catatan terkait, jika Anda ingin mendapatkan
int
nilai dariSystem.Enum
, maka diberikan die
sini:Kamu bisa menggunakan:
Dua yang terakhir benar-benar jelek. Saya lebih suka yang pertama.
sumber
Ini lebih mudah daripada yang Anda pikirkan - enum sudah merupakan int. Itu hanya perlu diingatkan:
sumber
Contoh:
Dan dalam kode di belakang untuk mendapatkan nilai enum:
atau
Enum akan bertambah 1, dan Anda dapat mengatur nilai awal. Jika Anda tidak menetapkan nilai awal, nilai awalnya akan ditetapkan sebagai 0.
sumber
1
diint
kecuali Anda secara eksplisit menentukan sebaliknyaSaya baru-baru ini dikonversi dari menggunakan enum dalam kode saya yang mendukung daripada menggunakan kelas dengan konstruktor yang dilindungi dan instance statis yang telah ditentukan (terima kasih kepada Roelof - C # Pastikan Nilai Valum Enum yang Valid - Metode Futureproof ).
Sehubungan dengan itu, berikut ini bagaimana saya sekarang mendekati masalah ini (termasuk konversi implisit ke / dari
int
).Keuntungan dari pendekatan ini adalah Anda mendapatkan semua yang Anda miliki dari enum, tetapi kode Anda sekarang jauh lebih fleksibel, jadi jika Anda perlu melakukan tindakan yang berbeda berdasarkan nilai
Question
, Anda dapat memasukkan logika ke dalamQuestion
dirinya sendiri (yaitu dalam OO yang disukai mode) sebagai kebalikan dari menempatkan banyak pernyataan kasus di seluruh kode Anda untuk menangani setiap skenario.NB: Jawaban diperbarui 2018-04-27 untuk memanfaatkan fitur C # 6; yaitu ekspresi pernyataan dan definisi tubuh ekspresi lambda. Lihat riwayat revisi untuk kode asli. Ini memiliki manfaat membuat definisi sedikit kurang bertele-tele; yang telah menjadi salah satu keluhan utama tentang pendekatan jawaban ini.
sumber
Jika Anda ingin mendapatkan bilangan bulat untuk nilai enum yang disimpan dalam variabel, untuk jenis yang akan digunakan
Question
, untuk digunakan misalnya dalam suatu metode, Anda bisa melakukan ini yang saya tulis dalam contoh ini:Ini akan mengubah judul jendela menjadi 4, karena variabelnya
Geselecteerd
adalahTalen.Nederlands
. Jika saya mengubahnyaTalen.Portugees
dan memanggil metode itu lagi, teks akan berubah menjadi 3.sumber
Untuk memastikan nilai enum ada dan kemudian menguraikannya, Anda juga dapat melakukan hal berikut.
sumber
Mungkin saya melewatkannya, tetapi adakah yang mencoba metode ekstensi generik sederhana?
Ini sangat bagus untuk saya. Anda dapat menghindari tipe cast di API Anda dengan cara ini tetapi pada akhirnya itu menghasilkan operasi tipe perubahan. Ini adalah kasus yang bagus untuk pemrograman Roslyn agar kompiler membuat metode GetValue <T> untuk Anda.
sumber
Satu lagi cara untuk melakukannya:
Ini akan menghasilkan:
sumber
... adalah deklarasi yang bagus.
Anda harus memberikan hasilnya ke int seperti:
Kalau tidak, jenisnya tetap
QuestionType
.Tingkat keketatan ini adalah cara C #.
Salah satu alternatif adalah dengan menggunakan deklarasi kelas sebagai gantinya:
Tidak terlalu elegan untuk dideklarasikan, tetapi Anda tidak perlu memasukkannya dalam kode:
Atau, Anda mungkin merasa lebih nyaman dengan Visual Basic, yang melayani harapan seperti ini di banyak bidang.
sumber
number
harus memiliki nilai2
.sumber
bool
*,byte
,ushort
,int
, danuint
**. GetHashCode untuk tipe lain memodifikasi nilainya, misalnya melakukan beberapa bitshifts dan xors. (* 1/0, ** dicetak ke int tentu saja). Tapi secara keseluruhan, jangan lakukan ini kecuali jika itu kode pribadi Anda.Anda dapat melakukan ini dengan menerapkan metode ekstensi ke tipe enum yang Anda tentukan:
Ini menyederhanakan mendapatkan nilai int dari nilai enum saat ini:
atau
sumber
Gunakan metode ekstensi sebagai gantinya:
Dan penggunaannya sedikit lebih cantik:
sumber
sumber
Menggunakan:
Itu akan menghasilkan
value == 2
.Ini hanya benar jika enum cocok di dalam sebuah
int
.sumber
int
tentu saja, karenaGetHashCode
mengembalikan bilangan bulat.Karena enum dapat dideklarasikan dengan beberapa tipe primitif, metode ekstensi umum untuk menggunakan tipe enum apa pun dapat berguna.
sumber
Berikut ini adalah metode ekstensi
sumber
Retasan favorit saya dengan enum int atau lebih kecil:
Untuk enum
Ini,
output
Penolakan:
Itu tidak bekerja untuk enum berdasarkan panjang.
sumber
Solusi termudah yang dapat saya pikirkan adalah membebani
Get(int)
metode seperti ini:di mana
[modifiers]
umumnya dapat sama denganGet(int)
metode. Jika Anda tidak dapat mengeditQuestions
kelas atau karena beberapa alasan tidak mau, Anda dapat membebani metode ini dengan menulis ekstensi:sumber
Contoh yang ingin saya sarankan "untuk mendapatkan nilai 'int' dari enum", adalah
Sekarang jawabannya adalah 1.
sumber
Menggunakan:
sumber
Coba yang ini alih-alih konversi enum ke int:
sumber
Dalam Visual Basic, seharusnya:
sumber
Saya datang dengan metode ekstensi ini yang mencakup fitur bahasa saat ini. Dengan menggunakan dinamis, saya tidak perlu menjadikan ini metode generik dan menentukan jenis yang membuat doa tetap lebih sederhana dan konsisten:
sumber