Saya memiliki enum misalnya ' Gender
' ( Male =0 , Female =1
) dan saya memiliki enum lain dari layanan yang memiliki enum Gender sendiri ( Male =0 , Female =1, Unknown =2
)
Pertanyaan saya adalah bagaimana saya bisa menulis sesuatu dengan cepat dan bagus untuk diubah dari enum mereka ke milik saya?
Jawaban:
Menggunakan metode ekstensi berfungsi cukup baik, saat menggunakan dua metode konversi yang disarankan oleh Nate:
Jelas tidak perlu menggunakan kelas terpisah jika Anda tidak mau. Preferensi saya adalah menyimpan metode ekstensi yang dikelompokkan berdasarkan kelas / struktur / enumerasi yang mereka terapkan.
sumber
Diberikan
Enum1 value = ...
, maka jika yang Anda maksud dengan nama:Jika yang Anda maksud dengan nilai numerik, biasanya Anda hanya dapat mentransmisikan:
(dengan cast, Anda mungkin ingin menggunakan
Enum.IsDefined
untuk memeriksa nilai yang valid, meskipun)sumber
Enum.Tryparse
:Enum2 value2 = Enum.TryParse(value.ToString(), out Enum2 outValue) ? outValue : Enum2.Unknown;
Ini akan memungkinkan Anda untuk menangani nilai input yang tidak adaEnum2
tanpa perlu memanggilEnum.IsDefined
atau menangkapArgumentException
yang dilemparEnum.Parse
. Perhatikan bahwa urutan parameter kurang lebih dibalikEnum.Parse
.Cukup lemparkan satu ke int dan kemudian lemparkan ke enum lain (mengingat Anda ingin pemetaan dilakukan berdasarkan nilai):
sumber
long
(atauulong
) daripadaint
yang memiliki anggota yang didefinisikan di atasint.MaxValue
(atau di bawahint.MinValue
), dalam hal ini transmisiint
dapat meluap dan Anda akan mendapatkan nilai enum yang tidak ditentukan yang harus ditentukan.Untuk lebih teliti, saya biasanya membuat sepasang fungsi, yang mengambil Enum 1 dan mengembalikan Enum 2 dan lainnya yang mengambil Enum 2 dan mengembalikan Enum 1. Masing-masing terdiri dari input pemetaan pernyataan kasus ke output dan kasus default melempar pengecualian dengan a pesan yang mengeluh tentang nilai yang tidak terduga.
Dalam kasus khusus ini, Anda dapat memanfaatkan fakta bahwa nilai integer Pria dan Wanita adalah sama, tetapi saya akan menghindarinya karena bersifat hackish dan dapat rusak jika enum berubah di masa mendatang.
sumber
Jika kita memiliki:
dan
Kita bisa melakukannya dengan aman
Atau bahkan
Jika Anda ingin menutupi kasus di mana enum di sisi kanan tanda '=' memiliki lebih banyak nilai daripada enum di sisi kiri - Anda harus menulis metode / kamus Anda sendiri untuk menutupi itu seperti yang disarankan orang lain.
sumber
Anda dapat menulis metode ekstensi umum sederhana seperti ini
sumber
Anda bisa menulis fungsi sederhana seperti berikut:
sumber
Berikut adalah versi metode ekstensi jika ada yang tertarik
sumber
sumber
Saya menulis metode ekstensi set beberapa waktu lalu yang berfungsi untuk beberapa jenis yang berbeda
Enum
. Satu secara khusus bekerja untuk apa yang Anda coba capai dan tanganiEnum
denganFlagsAttribute
sertaEnum
dengan jenis dasar yang berbeda.Dari sana Anda dapat menambahkan metode ekstensi lain yang lebih spesifik.
Yang ini akan mengubah jenis
Enum
seperti yang Anda coba lakukan.Berhati-hatilah, meskipun, Anda BISA mengonversi antara salah satu
Enum
dan yang lainEnum
menggunakan metode ini, bahkan yang tidak memiliki bendera. Sebagai contoh:Variabel
turtle
akan memiliki nilaiTurtle.Blue
.Namun, ada keamanan dari
Enum
nilai yang tidak ditentukan dengan menggunakan metode ini. Misalnya:Dalam kasus ini,
access
akan disetel keWriteAccess.ReadWrite
, karenaWriteAccess
Enum
memiliki nilai maksimum 3.Efek samping lain dari pencampuran
Enum
s denganFlagsAttribute
dan yang tanpanya adalah bahwa proses konversi tidak akan menghasilkan kecocokan 1 banding 1 di antara nilainya.Dalam kasus ini,
letters
akan memiliki nilaiLetters.H
alih - alihLetters.D
, karena nilai dukunganFlavors.Peach
adalah 8. Selain itu, konversi dariFlavors.Cherry | Flavors.Grape
menjadiLetters
akan menghasilkanLetters.C
, yang tampaknya tidak intuitif.sumber
Berdasarkan jawaban Justin di atas, saya mendapatkan ini:
sumber
Saya tahu itu pertanyaan lama dan memiliki banyak jawaban, Namun saya menemukan bahwa menggunakan pernyataan switch seperti pada jawaban yang diterima agak rumit, jadi inilah 2 sen saya:
Metode favorit pribadi saya adalah menggunakan kamus, di mana kuncinya adalah enum sumber dan nilainya adalah enum target - jadi dalam kasus yang disajikan pada pertanyaan, kode saya akan terlihat seperti ini:
Tentu saja, ini dapat digabungkan dalam kelas statis dan digunakan sebagai metode ekstensi:
sumber
Anda bisa menggunakan ToString () untuk mengonversi enum pertama ke namanya, lalu Enum.Parse () untuk mengonversi string kembali ke Enum lain. Ini akan memunculkan pengecualian jika nilai tidak didukung oleh enum tujuan (yaitu untuk nilai "Tidak diketahui")
sumber