ชื่อสตริง Enum จากค่า


407

ฉันมีโครงสร้าง enum เช่นนี้

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

ในฐานข้อมูลของฉันการแจกแจงถูกอ้างอิงโดยค่า คำถามของฉันคือฉันจะเปลี่ยนการแสดงตัวเลขของ enum กลับไปเป็นชื่อสตริงได้อย่างไร

ตัวอย่างเช่นกำหนดผลที่ควรจะเป็น2Visible


25
ฉันเชื่อว่าตอนนี้มีวิธีที่ง่ายกว่าในการทำเช่นนี้กับ VS 2015 nameof(EnumDisplayStatus.Visible)หวังว่าจะช่วยให้ใครซักคน
Gabriel Marius Popescu

คำตอบ:


542

คุณสามารถแปลงintด้านหลังเป็นสมาชิกการแจงนับได้ด้วยตัวละครธรรมดาแล้วโทรToString():

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

13
อัปเดต: มีการใช้งานเกินพิกัดบางอย่างโดยใช้ IFormatProvider เท่านั้น ToString () ใช้ได้ ดูgroups.google.com/group/DotNetDevelopment/browse_thread/thread/…
AndyM

พฤติกรรมในกรณีของenum Foo { A = 1, B= 1 }คืออะไร?
dbkk

3
@dbkk เอกสารระบุว่าเกี่ยวกับ enums "รหัสของคุณไม่ควรใช้สมมติฐานใด ๆ เกี่ยวกับสตริงที่จะส่งคืน" เนื่องจากสถานการณ์ที่แม่นยำที่คุณพูด ดูmsdn.microsoft.com/en-us/library/16c1xs4z.aspx
Paul D'Ambra

4
วิธีแก้ไขที่ปรับปรุงแล้ว: msdn.microsoft.com/en-us/library/…
แจ็ค

4
สั้นกว่า: var stringValue = ((EnumDisplayStatus) ค่า) .ToString ()
แดง 510

188

หากคุณต้องการรับสตริง"Visible"โดยไม่ได้รับEnumDisplayStatusอินสแตนซ์คุณสามารถทำได้:

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

5
หากคุณเกี่ยวกับคำตอบของ Mandoleen มีความไม่ถูกต้อง: Enum.GetName ส่งคืนสตริงไม่ใช่ Enum
algreat

สิ่งนี้สะท้อนการใช้งานหรือคอมไพเลอร์สร้างพจนานุกรมผู้ช่วยเหลือเพื่อใช้งานเบื้องหลังหรือไม่?
palswim

155

ลองสิ่งนี้:

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

@nilco คำตอบนี้เป็นสิ่งที่ดี แต่ฉันชอบคำตอบของ Kents ส่วนใหญ่เป็นเพราะฉันมีคุณลักษณะที่กำหนดเองใน enums ของฉัน "คำอธิบาย" จากนั้นฉันมีส่วนขยาย enum เพื่อรับรายละเอียด - นี่คือการแสดงบนหน้าจอสำหรับผู้ใช้
Harag

60

ใช้สิ่งนี้:

string bob = nameof(EnumDisplayStatus.Visible);

9
จำเป็นต้องใช้ C # 6+
Adam K Dean

10
@ AZChad มันเป็นสิ่งที่ดีที่จะรู้แน่นอน; แต่มันไม่ได้ใช้จริงในสถานการณ์ของ OP เนื่องจากค่ามาจากฐานข้อมูล (ดังนั้น: รันไทม์, ไม่ได้รวบรวมเวลา, ค่า)
Marc Gravell

22

คุณสามารถโยนมันได้

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

อ่า .. kent เอาชนะฉันได้ :)


ตอนนี้เคนต์ได้รับตัวแทน "คำตอบแรก" ทั้งหมด Nice one Kent! : p
Matt Kocaj

12

DB เป็น C #

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

C # ถึง DB

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

12

สารละลาย:

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

นอกจากนี้การใช้GetNameดีกว่าหล่อที่ชัดเจนของ Enum

[รหัสสำหรับการวัดประสิทธิภาพ]

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

[ผลตัวอย่าง]

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
นี่คือสำเนาของคำตอบอายุ 7 ปี คุณช่วยอธิบายได้ไหมว่าทำไมของคุณถึงดีกว่าต้นฉบับ
nvoigt

@nvoigt เพราะถ้าฉันถูกต้อง ToString () API บน Enum จะล้าสมัยแล้ว [ docs.microsoft.com/en-us/dotnet/api/…
Naveen Kumar V

ดังนั้น ... อย่างน้อยสองคำตอบให้รหัสที่คุณโพสต์ไว้แล้ว สิ่งที่คุณให้มากกว่าจาก Mandoleen หรือ algreat
nvoigt

@nvoigt พวกเขาไม่ได้พูดถึงประสิทธิภาพของมันเมื่อเปรียบเทียบกับการคัดเลือกนักแสดงอย่างชัดเจน เพียงพอสำหรับคุณที่จะชอบคำตอบของฉันหรือไม่ : p ขอบคุณอยู่แล้วฉันหวังว่ามันจะช่วยให้ใครบางคน :)
Naveen Kumar V

ดูเหมือนว่าเราจะมีปัญหาในการสื่อสาร คุณใช้โทรศัพท์มือถือหรือคุณไม่ได้เลื่อนลงไปมากพอหรือไม่? คำตอบของคุณมีอยู่สองสำเนาจาก 7 ปีย้อนหลัง ฉันตั้งชื่อผู้ตอบแล้วจึงควรหาง่าย คำตอบของคุณให้อะไรที่ไม่ได้อยู่ที่นี่อย่างน้อย 7 ปีแล้ว?
nvoigt

9

ที่เร็วที่สุดในการแก้ปัญหาโดยใช้เวลารวบรวมการแสดงออกnameof

ส่งคืนตัวอักษรของ enum

public enum MyEnum {
    CSV,
    Excel
}


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

บันทึก:

  • คุณจะไม่ต้องการที่จะตั้งชื่อ Enum ที่เป็นตัวพิมพ์ใหญ่เต็ม nameofแต่ใช้ในการแสดงให้เห็นถึงกรณีความไวของ

นี่ควรเป็นคำตอบ
แฟน LinPy

@LinPyfan ดีใจที่มันทำงานได้ดี! นี่คือค่อนข้างใหม่เมื่อเทียบกับวันที่ OP
เรียบเรียง

4

แค่ต้องการ:

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

1
ในกรณีส่วนใหญ่นี่เป็นคำตอบที่เหมือนกันมากจาก 10 ปีก่อน การเพิ่มตัว"f"ระบุนั้นเหมาะสมและอาจหรืออาจไม่ใช่สิ่งที่ผู้โทรต้องการ (ขึ้นอยู่กับ: สิ่งที่พวกเขาต้องการ): docs.microsoft.com/en-us/dotnet/standard/base-types/ …
Marc Gravell

ฉันไม่ได้ใส่ใจกับวันที่ ahah ฉันคิดว่าเป็นการดีที่จะอัปเดตโซลูชันเก่าเช่นนี้ ฉันจะไม่ใช่คนสุดท้ายที่เปิดหน้านี้ และขอขอบคุณสำหรับความแม่นยำของคุณ! :)
Al3x_M

3

สำหรับการรับค่าสตริง [ชื่อ]:

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

และสำหรับการรับค่า enum:

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

ทำไมไม่เพียงแค่เข้าสู่ระบบ () 'facepalm'
MeTitus

3

ฉันใช้รหัสนี้ที่ให้ไว้ด้านล่าง

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

1

เพียงแค่ใส่ค่า int ถึงชนิดการแจงนับ:

EnumDisplayStatus status = (EnumDisplayStatus) statusFromDatabase;
string statusString = status.ToString();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.