Bagaimana bisa int
dilemparkan ke dalam enum
di C #?
3193
Dari sebuah string:
YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString);
// The foo.ToString().Contains(",") check is necessary for enumerations marked with an [Flags] attribute
if (!Enum.IsDefined(typeof(YourEnum), foo) && !foo.ToString().Contains(","))
{
throw new InvalidOperationException($"{yourString} is not an underlying value of the YourEnum enumeration.")
}
Dari int:
YourEnum foo = (YourEnum)yourInt;
Memperbarui:
Dari nomor Anda juga bisa
YourEnum foo = (YourEnum)Enum.ToObject(typeof(YourEnum) , yourInt);
YourEnum
dinamis dan hanya akan diketahui saat runtime, dan apa yang saya inginkan adalah konversiEnum
?var result = Enum.TryParse(yourString, out yourEnum)
saat ini (dan memeriksa hasilnya untuk menentukan apakah konversi gagal).Enum.Parse
menjadi case-insensitive dengan menambahkantrue
nilai parameter pada panggilan:YourEnum foo = (YourEnum) Enum.Parse(typeof(YourEnum), yourString, true);
Hanya melemparkannya:
Anda dapat memeriksa apakah jangkauannya menggunakan Enum.IsDefined :
sumber
Enum.IsDefined
, ketahuilah bahwa itu bisa berbahaya: msdn.microsoft.com/en-us/library/ms229025(VS.90).aspxIsDefined
untuk memeriksa nilai input, Anda membuat diri Anda rentan terhadap orang menambahkan nilai enum baru nanti yang akan melewatiIsDefined
pemeriksaan (karena baru nilai ada dalam kode baru), tetapi mungkin tidak berfungsi dengan kode asli yang Anda tulis. Oleh karena itu lebih aman untuk secara eksplisit menentukan nilai enum yang dapat ditangani oleh kode Anda.Atau, gunakan metode ekstensi alih-alih satu baris:
Pemakaian:
ATAU
sumber
System.String
sepertinya seperti polusi namespaceSaya pikir untuk mendapatkan jawaban yang lengkap, orang harus tahu bagaimana enum bekerja secara internal di .NET.
Bagaimana cara kerjanya?
Enum di .NET adalah struktur yang memetakan serangkaian nilai (bidang) ke tipe dasar (defaultnya adalah
int
). Namun, Anda sebenarnya dapat memilih tipe integral yang dipetakan oleh enum Anda:Dalam hal ini enum dipetakan ke
short
tipe data, yang berarti enum akan disimpan dalam memori sebagai pendek dan akan berperilaku sebagai pendek ketika Anda menggunakan dan menggunakannya.Jika Anda melihatnya dari sudut pandang IL, enum (normal, int) terlihat seperti ini:
Apa yang harus mendapat perhatian Anda di sini adalah bahwa
value__
disimpan secara terpisah dari nilai enum. Dalam kasus enum diFoo
atas, tipevalue__
int16. Ini pada dasarnya berarti bahwa Anda dapat menyimpan apa pun yang Anda inginkan dalam enum, selama jenisnya cocok .Pada titik ini saya ingin menunjukkan bahwa itu
System.Enum
adalah tipe nilai, yang pada dasarnya berartiBarFlag
akan memakan 4 byte dalam memori danFoo
akan memakan 2 - misalnya ukuran tipe yang mendasarinya (sebenarnya lebih rumit dari itu, tetapi Hei...).Jawabannya
Jadi, jika Anda memiliki bilangan bulat yang ingin Anda petakan ke enum, runtime hanya perlu melakukan 2 hal: salin 4 byte dan beri nama yang lain (nama enum). Menyalin adalah implisit karena data disimpan sebagai tipe nilai - ini pada dasarnya berarti bahwa jika Anda menggunakan kode yang tidak dikelola, Anda dapat dengan mudah bertukar enum dan bilangan bulat tanpa menyalin data.
Untuk membuatnya aman, saya pikir itu praktik terbaik untuk mengetahui bahwa tipe yang mendasarinya adalah sama atau secara implisit dapat dikonversi dan untuk memastikan nilai enum ada (mereka tidak diperiksa secara default!).
Untuk melihat cara kerjanya, coba kode berikut:
Perhatikan bahwa casting
e2
juga berfungsi! Dari perspektif kompiler di atas ini masuk akal:value__
bidang hanya diisi dengan 5 atau 6 dan ketikaConsole.WriteLine
panggilanToString()
, namae1
diselesaikan sementara namae2
tidak.Jika bukan itu yang Anda maksudkan, gunakan
Enum.IsDefined(typeof(MyEnum), 6)
untuk memeriksa apakah nilai yang Anda lemparkan peta ke enum yang ditentukan.Perhatikan juga bahwa saya eksplisit tentang tipe enum yang mendasarinya, meskipun kompiler benar-benar memeriksa ini. Saya melakukan ini untuk memastikan saya tidak mengalami kejutan di jalan. Untuk melihat kejutan ini dalam tindakan, Anda dapat menggunakan kode berikut (sebenarnya saya sering melihat ini terjadi dalam kode basis data):
sumber
int
! =short
, Ia akan melempar (pembatalan kotak gagal). Jika Anda melakukannyaobject o = (short)5;
, itu akan berhasil, karena jenisnya akan cocok. Ini bukan tentang kisaran, ini tentang jenis.Ambil contoh berikut:
sumber
Saya menggunakan potongan kode ini untuk memberikan int ke enum saya:
Saya menemukannya solusi terbaik.
sumber
Di bawah ini adalah kelas utilitas yang bagus untuk Enums
sumber
Untuk nilai numerik, ini lebih aman karena akan mengembalikan objek apa pun yang terjadi:
sumber
Jika Anda siap untuk 4.0 .NET Framework, ada fungsi Enum.TryParse () baru yang sangat berguna dan berfungsi dengan baik dengan atribut [Flags]. Lihat Metode Enum.TryParse (String, TEnum%)
sumber
Jika Anda memiliki integer yang bertindak sebagai bitmask dan bisa mewakili satu atau lebih nilai dalam enumerasi [Bendera], Anda bisa menggunakan kode ini untuk mem-parsing nilai flag individual ke dalam daftar:
Perhatikan bahwa ini mengasumsikan bahwa tipe yang mendasari
enum
adalah integer 32-bit yang ditandatangani. Jika itu adalah tipe numerik yang berbeda, Anda harus mengubah hardcoded 32 untuk mencerminkan bit dalam tipe itu (atau secara terprogram menurunkannya menggunakanEnum.GetUnderlyingType()
)sumber
Terkadang Anda memiliki objek dengan
MyEnum
tipe tersebut. SukaKemudian:
sumber
Ini adalah metode pengubahan tanda sadar konversi bendera:
sumber
Enum
alih-alihstruct
, artinya kita tidak harus bergantung pada pemeriksaan runtime!Untuk mengonversi string menjadi ENUM atau int menjadi ENUM, kita perlu menggunakan fungsi Enum.Parse. Ini adalah video youtube https://www.youtube.com/watch?v=4nhx4VwdRDk yang sebenarnya menunjukkan dengan string dan hal yang sama berlaku untuk int.
Kode berjalan seperti yang ditunjukkan di bawah ini di mana "merah" adalah string dan "MyColors" adalah warna ENUM yang memiliki konstanta warna.
sumber
Sedikit menjauh dari pertanyaan awal, tetapi saya menemukan jawaban untuk pertanyaan Stack Overflow Dapatkan nilai int dari enum berguna. Buat kelas statis dengan
public const int
properti, yang memungkinkan Anda untuk dengan mudah mengumpulkan sekelompokint
konstanta terkait , dan kemudian tidak harus membuangnyaint
saat menggunakannya.Jelas, beberapa fungsionalitas tipe enum akan hilang, tetapi untuk menyimpan sekelompok konstanta id database, sepertinya solusi yang cukup rapi.
sumber
Ini mem-parsing bilangan bulat atau string ke target enum dengan pencocokan parsial di dot.NET 4.0 menggunakan obat generik seperti pada kelas utilitas Tawani di atas. Saya menggunakannya untuk mengubah variabel saklar baris perintah yang mungkin tidak lengkap. Karena enum tidak boleh nol, Anda harus memberikan nilai default secara logis. Ini bisa disebut seperti ini:
Berikut kodenya:
FYI: Pertanyaannya adalah tentang bilangan bulat, yang tidak ada yang disebutkan juga akan secara eksplisit dikonversi di Enum.TryParse ()
sumber
Dari string: (Enum.Parse kedaluwarsa, gunakan Enum.TryParse)
sumber
Berikut ini adalah metode ekstensi yang sedikit lebih baik
sumber
Dalam kasus saya, saya perlu mengembalikan enum dari layanan WCF. Saya juga membutuhkan nama yang ramah, bukan hanya enum.ToString ().
Inilah Kelas WCF saya.
Inilah metode Extension yang mendapatkan Deskripsi dari Enum.
Penerapan:
sumber
Saya tidak tahu lagi dari mana saya mendapatkan bagian dari ekstensi enum ini, tetapi dari stackoverflow. Saya minta maaf untuk ini! Tetapi saya mengambil yang ini dan memodifikasinya untuk enum dengan Bendera. Untuk enum dengan Bendera saya melakukan ini:
Contoh:
sumber
Anda harus membangun beberapa jenis relaksasi yang cocok agar lebih kuat.
Kasus cobaan
sumber
Berbagai cara dilemparkan ke dan dari
Enum
sumber
Ini dapat membantu Anda mengonversi data input apa pun ke enum yang diinginkan pengguna . Misalkan Anda memiliki enum seperti di bawah ini yang secara default int . Harap tambahkan nilai Default di awal enum Anda. Yang digunakan pada medthod helper ketika tidak ditemukan kecocokan dengan nilai input.
NB: Di sini saya mencoba mem-parsing nilai ke int, karena enum secara default int Jika Anda mendefinisikan enum seperti ini yang merupakan tipe byte .
Anda perlu mengubah metode parsing at helper dari
untuk
byte.TryParse(value.ToString(), out tempType)
Saya memeriksa metode saya untuk input berikut
maaf untuk bahasa inggris saya
sumber
Inilah metode ekstensi yang digunakan
Int32
untukEnum
.Itu menghormati bendera bitwise bahkan ketika nilainya lebih tinggi dari maksimum yang mungkin. Misalnya jika Anda memiliki enum dengan kemungkinan 1 , 2 , dan 4 , tetapi intnya adalah 9 , ia memahami bahwa sebagai 1 tanpa adanya 8 . Ini memungkinkan Anda melakukan pembaruan data sebelum pembaruan kode.
sumber
cara mudah dan jelas untuk menampilkan int ke enum di c #:
sumber
Anda cukup menggunakan Konversi konversi Cast int ke enum atau enum ke int
sumber
sumber
Anda cukup melakukan seperti di bawah ini:
Untuk memastikan bahwa Anda hanya memberikan nilai yang benar dan Anda dapat melemparkan pengecualian:
Perhatikan bahwa menggunakan IsDefined mahal dan bahkan lebih dari sekadar casting, jadi itu tergantung pada implementasi Anda untuk memutuskan untuk menggunakannya atau tidak.
sumber
Anda dapat menggunakan metode ekstensi.
gunakan kode seperti di bawah ini
enum:
Penggunaan:
sumber