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.


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();

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
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);

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);

@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);

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 :)


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();

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

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.

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"

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 ));

Mengapa tidak .ToString ()? 'facepalm'
MeTitus

3

saya telah menggunakan kode ini di bawah ini

 CustomerType = ((EnumCustomerType)(cus.CustomerType)).ToString()

1

Cukup masukkan int ke jenis enumerasi:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.