Enum saya terdiri dari nilai-nilai berikut:
private enum PublishStatusses{
NotCompleted,
Completed,
Error
};
Saya ingin dapat menampilkan nilai-nilai ini dengan cara yang ramah pengguna.
Saya tidak perlu bisa beralih dari string ke nilai lagi.
Jawaban:
Saya menggunakan
Description
atribut dari namespace System.ComponentModel. Cukup dekorasikan enum:Kemudian gunakan kode ini untuk mengambilnya:
sumber
ArgumentException
, maka tidak ada alasan untuk membuat metode ini sepenuhnya generik.Saya melakukan ini dengan metode ekstensi:
sumber
default
implementasi kasus kembalime.ToString()
dan hanya memberikan pernyataan beralih kasus untuk nilai enum yang ingin Anda timpa. Dalam contoh Anda, saya mendapatkan bahwa semuanya berbeda tetapi dalam kasus penggunaan aktual, saya menduga bahwa sebagian besar nilai enum kata tunggal sudah cukup dan Anda hanya akan memberikan penggantian untuk nilai enum multi-kata.Mungkin saya melewatkan sesuatu, tetapi apa yang salah dengan Enum. Dapatkan Nama?
sunting: untuk string yang mudah digunakan, Anda harus melalui .resource untuk menyelesaikan internasionalisasi / lokalisasi, dan akan lebih baik menggunakan kunci tetap berdasarkan pada kunci enum daripada atribut dekorator pada saat yang sama.
sumber
Saya membuat metode ekstensi terbalik untuk mengubah deskripsi kembali menjadi nilai enum:
sumber
Solusi termudah di sini adalah dengan menggunakan metode ekstensi kustom (setidaknya. NET 3.5 - Anda bisa mengubahnya menjadi metode pembantu statis untuk versi kerangka kerja sebelumnya).
Saya berasumsi di sini bahwa Anda ingin mengembalikan sesuatu selain nama sebenarnya dari nilai enum (yang dapat Anda peroleh hanya dengan menelepon ToString).
sumber
Pos lain itu adalah Jawa. Anda tidak dapat memasukkan metode dalam Enums di C #.
lakukan saja seperti ini:
Jika Anda ingin menggunakan nilai tampilan yang berbeda untuk nilai enum Anda, Anda bisa menggunakan Atribut dan Refleksi.
sumber
Cara paling sederhana adalah dengan memasukkan kelas ekstensi ini ke dalam proyek Anda, itu akan bekerja dengan enum dalam proyek:
Pemakaian:
...
sumber
string result = "Result: " + ee;
Beberapa opsi lain yang lebih primitif yang menghindari kelas / tipe referensi:
Metode array
Pemakaian
Metode struct bersarang
Pemakaian
Pembaruan (03/09/2018)
Hibrida Metode Penyuluhan dan teknik pertama di atas.
Saya lebih suka enum didefinisikan di mana mereka "milik" (paling dekat dengan sumber asalnya dan tidak dalam beberapa, namespace global umum).
Metode ekstensi tampaknya cocok untuk area umum, dan definisi "terlokalisasi" dari enum sekarang membuat metode ekstensi lebih verbose.
Contoh penggunaan enum dan metode ekstensi itu.
Catatan: Saya benar-benar memutuskan untuk menghilangkan
Enum
pembungkus (danName
array), karena yang terbaik adalah string nama berasal dari sumber daya (yaitu file config atau DB) daripada kode keras, dan karena saya akhirnya meletakkan metode ekstensi diViewModels
namespace (hanya dalam file "CommonVM.cs" yang berbeda). Plus.Id
semuanya menjadi mengganggu dan rumit.CommonVM.cs
Contoh penggunaan enum dan metode ekstensi itu.
sumber
Anda dapat menggunakan Humanizer paket dengan Humanize Enums possiblity. Contoh:
maka Anda dapat menggunakan
Humanize
metode ekstensi pada enum secara langsung:sumber
Sehubungan dengan Ray Booysen, ada bug dalam kode: Enum ToString dengan string yang ramah pengguna
Anda perlu memperhitungkan beberapa atribut pada nilai enum.
sumber
sumber
this
parameter dalam metode ekstensi, yang dapat Anda lihat dipanggilThis
dalam banyak contoh di web. Menyebutnya seperti tipenya seperti yang Anda lakukan (Enum Enum
) membuat kode kurang dibaca.Alih-alih menggunakan enum, gunakan kelas statis.
menggantikan
dengan
itu akan digunakan seperti ini
Masalah menggunakan solusi "metode ekstensi" teratas:
Enum pribadi sering digunakan di dalam kelas lain. Solusi metode ekstensi tidak valid di sana karena harus di kelasnya sendiri. Solusi ini bisa bersifat pribadi dan tertanam di kelas lain.
sumber
Saya kebetulan adalah penggemar VB.NET, jadi inilah versi saya, yang menggabungkan metode DescriptionAttribute dengan metode ekstensi. Pertama, hasilnya:
Hal-hal dasar: enum yang disebut EnumType dengan tiga nilai V1, V2 dan V3. "Magic" terjadi di panggilan Console.WriteLine di Sub Main (), di mana argumen terakhirnya sederhana
v.Description
. Ini mengembalikan "Satu" untuk V1, "V2" untuk V2, dan "Tiga" untuk V3. Metode Deskripsi ini sebenarnya adalah metode ekstensi, didefinisikan dalam modul lain yang disebut EnumExtensions:Karena mencari atribut deskripsi menggunakan
Reflection
lambat, pencarian juga di-cache di pribadiDictionary
, yang diisi berdasarkan permintaan.(Maaf untuk solusi VB.NET - seharusnya relatif lebih mudah untuk menerjemahkannya ke C #, dan C # saya berkarat pada subjek baru seperti ekstensi)
sumber
Bersihkan ringkasan saran di atas dengan sampel:
PEMAKAIAN:
sumber
Gunakan Enum.GetName
Dari tautan di atas ...
sumber
Menurut dokumentasi ini: https://docs.microsoft.com/pt-br/dotnet/api/system.enum.tostring?view=netframework-4.8
Dimungkinkan untuk mengonversi enumerator menjadi string menggunakan format seperti ini:
Anda dapat melihat semua format yang mungkin di tautan ini: https://docs.microsoft.com/pt-br/dotnet/api/system.string?view=netframework-4.8
sumber
Ini adalah pembaruan untuk kode Ray Booysen yang menggunakan metode GetCustomAttributes generik dan LINQ untuk membuat hal-hal sedikit lebih rapi.
sumber
Ringkasan yang lebih bersih:
Penggunaan yang sama dengan yang digambarkan garis bawah.
sumber
Untuk bendera termasuk enum.
sumber
Jika Anda hanya ingin menambahkan spasi putih di antara kata-kata, sesederhana itu
sumber
Saya menggunakan kelas generik untuk menyimpan pasangan enum / deskripsi dan kelas penolong bersarang untuk mendapatkan deskripsi.
The enum :
Kelas generik:
Catatan: Karena kelas generik tidak dapat dibatasi oleh enum saya dibatasi oleh struct sebagai gantinya dan memeriksa enum di konstruktor.
Pemakaian:
sumber
Saya pikir cara terbaik (dan termudah) untuk menyelesaikan masalah Anda adalah dengan menulis Extension-Method untuk enum Anda:
sumber
Jika Anda ingin sesuatu yang sepenuhnya dapat disesuaikan, cobalah solusi saya di sini:
http://www.kevinwilliampang.com/post/Mapping-Enums-To-Strings-and-Strings-to-Enums-in-NET.aspx
Pada dasarnya, posting menguraikan cara melampirkan atribut Deskripsi ke setiap enum Anda dan menyediakan cara umum untuk memetakan dari enum ke deskripsi.
sumber