Enum String Name dari Value

407

Saya memiliki konstruksi enum seperti ini:

public enum EnumDisplayStatus
{
    None    = 1,
    Visible = 2,
    Hidden  = 3,
    MarkedForDeletion = 4
}

Dalam database saya, enumerasi direferensikan oleh nilai. Pertanyaan saya adalah, bagaimana saya bisa mengubah representasi nomor enum kembali ke nama string.

Misalnya, mengingat 2hasilnya harus Visible.

jdee
sumber
25
Saya percaya, sekarang ada cara yang lebih mudah untuk melakukan ini dengan VS 2015 nameof(EnumDisplayStatus.Visible)Semoga ini bisa membantu seseorang
Gabriel Marius Popescu

Jawaban:

542

Anda dapat mengonversi bagian intbelakang menjadi anggota enumerasi dengan gips sederhana, lalu memanggil ToString():

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();
Kent Boogaart
sumber
13
Pembaruan: hanya kelebihan tertentu menggunakan IFormatProvider yang ditinggalkan. ToString () tidak masalah. Lihat groups.google.com/group/DotNetDevelopment/browse_thread/thread/…
AndyM
Apa perilaku dalam kasus enum Foo { A = 1, B= 1 }?
dbkk
3
@ dbkk dokumentasi menyatakan bahwa berkaitan dengan enums "kode Anda tidak boleh membuat asumsi tentang string mana yang akan dikembalikan." karena situasi tepat yang Anda kutip. lihat msdn.microsoft.com/en-us/library/16c1xs4z.aspx
Paul D'Ambra
4
Solusi uptodated: msdn.microsoft.com/en-us/library/…
Jack
4
lebih pendek: var stringValue = ((EnumDisplayStatus) nilai) .ToString ()
redwards510
188

Jika Anda perlu mendapatkan string "Visible"tanpa mendapatkan EnumDisplayStatusinstance, Anda dapat melakukan ini:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);
algreat
sumber
5
Jika Anda tentang jawaban Mandoleen ada ketidaktepatan: Enum.GetName mengembalikan string, bukan Enum
algreat
Apakah ini menggunakan refleksi atau apakah kompiler membuat kamus pembantu untuk digunakan di belakang layar?
palswim
155

Coba ini:

string m = Enum.GetName(typeof(MyEnumClass), value);
Mandoleen
sumber
@nilco jawaban ini bagus, tapi saya lebih suka jawaban Kents, terutama karena saya memiliki atribut khusus pada enums saya "Deskripsi" Saya kemudian memiliki ekstensi enum untuk mendapatkan deskripsi - ini untuk ditampilkan di layar untuk pengguna.
Harag
60

Gunakan ini:

string bob = nameof(EnumDisplayStatus.Visible);
James Cooke
sumber
9
Diperlukan C # 6+.
Adam K Dean
10
@AZChad itu hal yang hebat untuk diketahui, tentu saja; tetapi itu tidak benar - benar berlaku dalam skenario OP, karena nilainya berasal dari basis data (jadi: runtime, bukan waktu kompilasi, nilai)
Marc Gravell
22

Anda bisa melemparkannya

int dbValue = 2;
EnumDisplayStatus enumValue = (EnumDisplayStatus)dbValue;
string stringName = enumValue.ToString(); //Visible

ah .. kent mengalahkan saya untuk itu :)

Telah
sumber
Sekarang Kent mendapat semua jawaban "jawaban pertama". Kent yang bagus! : p
Matt Kocaj
12

DB ke C #

EnumDisplayStatus status = (EnumDisplayStatus)int.Parse(GetValueFromDb());

C # ke DB

string dbStatus = ((int)status).ToString();

sumber
12

LARUTAN:

int enumValue = 2; // The value for which you want to get string 
string enumName = Enum.GetName(typeof(EnumDisplayStatus), enumValue);

Juga, menggunakan GetName lebih baik daripada casting Enum eksplisit .

[Kode untuk Tolok Ukur Kinerja]

Stopwatch sw = new Stopwatch (); sw.Start (); sw.Stop (); sw.Reset ();
double sum = 0;
int n = 1000;
Console.WriteLine ("\nGetName method way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = Enum.GetName (typeof (Roles), roleValue);
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Getname method casting way: {sum / n}");
Console.WriteLine ("\nExplicit casting way:");
for (int i = 0; i < n; i++) {
   sw.Start ();
   string t = ((Roles)roleValue).ToString ();
   sw.Stop ();
   sum += sw.Elapsed.TotalMilliseconds;
   sw.Reset ();
}
Console.WriteLine ($"Average of {n} runs using Explicit casting way: {sum / n}");

[Hasil sampel]

GetName method way:
Average of 1000 runs using Getname method casting way: 0.000186899999999998
Explicit casting way:
Average of 1000 runs using Explicit casting way: 0.000627900000000002
Naveen Kumar V
sumber
2
Ini adalah salinan dari jawaban 7 tahun. Bisakah Anda menjelaskan mengapa milik Anda lebih baik dari aslinya?
nvoigt
@nvoigt Karena, jika saya benar, API ToString () pada Enum sekarang sudah usang. [ docs.microsoft.com/en-us/dotnet/api/…
Naveen Kumar V
Jadi ... setidaknya dua jawaban lain sudah menyediakan kode yang Anda posting. Apa yang Anda berikan dari Mandoleen atau algreat?
nvoigt
@nvoigt Mereka tidak menyebutkan tentang kinerjanya dibandingkan dengan casting Eksplisit. Apakah ini cukup bagi Anda untuk menyukai jawaban saya? : p Terima kasih, saya harap ini akan membantu seseorang. :)
Naveen Kumar V
Kami sepertinya memiliki masalah komunikasi. Apakah Anda menggunakan perangkat seluler atau mungkin Anda tidak menggulir ke bawah cukup jauh? Ada dua salinan tepat jawaban Anda dari 7 tahun yang lalu. Saya beri nama penjawabnya, sehingga mudah ditemukan. Apa jawaban Anda yang belum ada di sini selama setidaknya 7 tahun?
nvoigt
9

Solusi waktu kompilasi tercepat menggunakan nameof ekspresi .

Mengembalikan literal enum.

public enum MyEnum {
    CSV,
    Excel
}


string enumAsString = nameof(MyEnum.CSV)
// enumAsString = "CSV"

catatan:

  • Anda tidak ingin memberi nama enum dalam huruf besar penuh, tetapi digunakan untuk menunjukkan sensitivitas huruf nameof.
Menuai
sumber
Ini seharusnya menjadi jawaban.
Penggemar LinPy
@LinPyfan Senang itu bekerja dengan baik! Ini relatif baru dibandingkan dengan tanggal OP.
Menuai
4

Hanya perlu:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"
Al3x_M
sumber
1
dalam kebanyakan kasus, ini hampir identik dengan jawaban teratas dari 10 tahun yang lalu; penambahan "f"specifier bernuansa, dan mungkin atau mungkin bukan apa yang diinginkan penelepon (tergantung pada: apa yang mereka inginkan): docs.microsoft.com/en-us/dotnet/standard/base-types/…
Marc Gravell
Saya tidak memperhatikan tanggal ahah. Saya pikir itu baik untuk memperbarui sedikit solusi lama seperti ini. Saya tidak akan menjadi orang terakhir yang membuka halaman ini. Dan terima kasih atas ketepatan Anda! :)
Al3x_M
3

Untuk mendapatkan nilai String [Nama]:

EnumDisplayStatus enumDisplayStatus = (EnumDisplayStatus)GetDBValue();
string stringValue = $"{enumDisplayStatus:G}"; 

Dan untuk mendapatkan nilai enum:

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));
Muhammad Aqib
sumber
Mengapa tidak .ToString ()? 'facepalm'
MeTitus
3

saya telah menggunakan kode ini di bawah ini

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()
Biddut
sumber
1

Cukup masukkan int ke jenis enumerasi:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
lacop
sumber