Tên chuỗi Enum từ giá trị


407

Tôi có một cấu trúc enum như thế này:

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

Trong cơ sở dữ liệu của tôi, bảng liệt kê được tham chiếu theo giá trị. Câu hỏi của tôi là, làm thế nào tôi có thể biến đại diện số của enum trở lại tên chuỗi.

Ví dụ, đưa ra 2kết quả nên được Visible.


25
Tôi tin rằng, bây giờ có một cách dễ dàng hơn để làm điều này với VS 2015 nameof(EnumDisplayStatus.Visible)Hy vọng nó sẽ giúp được ai đó
Gabriel Marius Popescu

Câu trả lời:


542

Bạn có thể chuyển đổi inttrở lại thành một thành viên liệt kê với một diễn viên đơn giản, và sau đó gọi ToString():

int value = GetValueFromDb();
var enumDisplayStatus = (EnumDisplayStatus)value;
string stringValue = enumDisplayStatus.ToString();

13
Cập nhật: chỉ một số tình trạng quá tải nhất định khi sử dụng IFormatProvider không được chấp nhận. ToString () vẫn ổn. Xem nhóm.google.com/group/DotNetDevelopment/browse_thread/thread/ Kẻ
AndyM

Hành vi trong trường hợp là enum Foo { A = 1, B= 1 }gì?
dbkk

3
@dbkk tài liệu nói rằng liên quan đến enums "mã của bạn không nên đưa ra bất kỳ giả định nào về chuỗi nào sẽ được trả về." bởi vì tình hình chính xác mà bạn trích dẫn xem msdn.microsoft.com/en-us/l Library / 16c1xs4z.aspx
Paul D'Ambra

4
Một giải pháp nâng cao: msdn.microsoft.com/en-us/l Library / từ
Jack

4
ngắn hơn: giá trị var stringValue = ((EnumDisplayStatus)) .ToString ()
redwards510

188

Nếu bạn cần lấy một chuỗi "Visible"mà không lấy EnumDisplayStatusví dụ, bạn có thể làm điều này:

int dbValue = GetDBValue();
string stringValue = Enum.GetName(typeof(EnumDisplayStatus), dbValue);

5
Nếu bạn về câu trả lời của Mandoleen thì có một sự không chính xác: Enum.GetName trả về một chuỗi, không phải là Enum
algreat

Điều này có sử dụng sự phản chiếu hay trình biên dịch tạo ra một từ điển trợ giúp để sử dụng đằng sau hậu trường không?
palswim

155

Thử cái này:

string m = Enum.GetName(typeof(MyEnumClass), value);

@nilco câu trả lời này là tốt, nhưng tôi thích câu trả lời của Kents, chủ yếu là vì tôi có một thuộc tính tùy chỉnh trên enum của mình "Mô tả" Sau đó tôi có một phần mở rộng enum để có được mô tả - đây là để hiển thị trên màn hình cho người dùng.
Harag

60

Dùng cái này:

string bob = nameof(EnumDisplayStatus.Visible);

9
C # 6+ yêu cầu mặc dù.
Adam K Dean

10
@AZChad đó là một điều tuyệt vời để biết, chắc chắn; nhưng nó không thực sự áp dụng trong kịch bản của OP, vì các giá trị đến từ cơ sở dữ liệu (vì vậy: thời gian chạy, không phải thời gian biên dịch, các giá trị)
Marc Gravell

22

bạn có thể bỏ nó

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

ah .. kent đánh tôi với nó :)


Bây giờ Kent nhận được tất cả các đại diện "câu trả lời đầu tiên". Đẹp một Kent! : p
Matt Kocaj

12

DB đến C #

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

C # đến DB

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

12

GIẢI PHÁP:

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

Ngoài ra, sử dụng GetName tốt hơn so với đúc Enum .

[Mã cho điểm chuẩn hiệu suất]

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

[Kết quả mẫu]

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
Đây là một bản sao của một câu trả lời 7 tuổi. Bạn có thể giải thích tại sao của bạn là tốt hơn so với bản gốc?
nvoigt

@nvoigt Bởi vì, nếu tôi đúng, API ToString () trên Enum hiện đã lỗi thời. [ docs.microsoft.com/en-us/dotnet/api/ từ
Naveen Kumar V

Vì vậy, ... ít nhất hai câu trả lời khác đã cung cấp mã bạn đã đăng. Bạn cung cấp những gì từ Mandoleen hoặc algreat?
nvoigt

@nvoigt Họ không đề cập đến hiệu suất của nó so với đúc Rõ ràng. Điều này có đủ để bạn thích câu trả lời của tôi không? : p Dù sao cũng cảm ơn, tôi hy vọng nó sẽ giúp được ai đó. :)
Naveen Kumar V

Chúng tôi dường như có một vấn đề giao tiếp. Bạn đang sử dụng thiết bị di động hay có thể bạn không cuộn xuống đủ xa? Có hai bản sao chính xác câu trả lời của bạn từ 7 năm trước. Tôi đặt tên cho người trả lời, vì vậy họ sẽ dễ dàng tìm thấy. Câu trả lời của bạn cung cấp những gì đã không ở đây ít nhất 7 năm rồi?
nvoigt

9

Các giải pháp thời gian nhanh nhất, biên dịch bằng cách sử dụng nameof biểu thức .

Trả về nghĩa đen của enum.

public enum MyEnum {
    CSV,
    Excel
}


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

Ghi chú:

  • Bạn sẽ không muốn đặt tên một enum bằng chữ in hoa đầy đủ, nhưng được sử dụng để chứng minh độ nhạy của chữ hoa nameof.

Đây phải là một câu trả lời.
Quạt LinPy

@LinPyfan Vui mừng vì nó hoạt động tốt! Đây là một tương đối mới so với ngày OP.
Riệp

4

Chỉ cần:

string stringName = EnumDisplayStatus.Visible.ToString("f");
// stringName == "Visible"

1
trong hầu hết các trường hợp, điều này khá giống với câu trả lời hàng đầu từ 10 năm trước; việc bổ sung bộ "f"xác định là sắc thái, và có thể hoặc không phải là những gì người gọi muốn (nó phụ thuộc vào: họ muốn gì): docs.microsoft.com/en-us/dotnet/stiteria/base-types/ tựa
Marc Gravell

Tôi đã không chú ý đến ngày ahah. Tôi nghĩ thật tốt khi cập nhật một chút giải pháp cũ như thế này. Tôi sẽ không phải là người cuối cùng mở trang này. Và cảm ơn sự chính xác của bạn! :)
Al3x_M

3

Để nhận giá trị Chuỗi [Tên]:

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

Và để có được giá trị enum:

string stringValue = $"{enumDisplayStatus:D}";
SetDBValue(Convert.ToInt32(stringValue ));

Tại sao không chỉ .ToString ()? 'facepalm'
MeTitus

3

tôi đã sử dụng mã này được đưa ra dưới đây

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

1

Chỉ cần chuyển int thành kiểu liệt kê:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.