วิธีรับค่า enum จากสตริงใน C #


103

ฉันมี enum:

public enum baseKey : uint
{  
    HKEY_CLASSES_ROOT = 0x80000000,
    HKEY_CURRENT_USER = 0x80000001,
    HKEY_LOCAL_MACHINE = 0x80000002,
    HKEY_USERS = 0x80000003,
    HKEY_CURRENT_CONFIG = 0x80000005
}

ฉันจะให้สตริงHKEY_LOCAL_MACHINEรับค่า0x80000002ตาม enum ได้อย่างไร

คำตอบ:


174
baseKey choice;
if (Enum.TryParse("HKEY_LOCAL_MACHINE", out choice)) {
     uint value = (uint)choice;

     // `value` is what you're looking for

} else { /* error: the string was not an enum member */ }

ก่อน. NET 4.5 คุณต้องทำสิ่งต่อไปนี้ซึ่งมีโอกาสเกิดข้อผิดพลาดได้ง่ายกว่าและมีข้อยกเว้นเมื่อส่งผ่านสตริงที่ไม่ถูกต้อง:

(uint)Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE")

1
ฉันสงสัยเสมอว่าทำไมยังไม่มีการโอเวอร์โหลดทั่วไปสำหรับ Enum.Parse มันค้างชำระนาน
Falanwe

3
ตอนนี้มีวิธี Enum.TryParse <TEnum> () ทั่วไป
Eugene Maksimov




2
var value = (uint)Enum.Parse(typeof(basekey), "HKEY_LOCAL_MACHINE", true);

ข้อมูลโค้ดนี้แสดงให้เห็นถึงการได้รับค่า enum จากสตริง ในการแปลงจากสตริงคุณต้องใช้Enum.Parse()วิธีการแบบคงที่ซึ่งใช้ 3 พารามิเตอร์ ประการแรกคือประเภทของ enum ที่คุณต้องการพิจารณา ไวยากรณ์คือคีย์เวิร์ดtypeof()ตามด้วยชื่อของคลาส enum ในวงเล็บ พารามิเตอร์ที่สองคือสตริงที่จะแปลงและพารามิเตอร์ที่สามเป็นการboolระบุว่าคุณควรละเว้นตัวพิมพ์เล็กและใหญ่ในขณะที่ทำการแปลงหรือไม่

สุดท้ายทราบว่าEnum.Parse()จริงกลับอ้างอิงวัตถุนั่นหมายความว่าคุณจะต้องชัดเจนแปลงนี้เพื่อประเภท enum ที่จำเป็น ( string, intฯลฯ )

ขอบคุณ.


-2

ทางเลือกอื่นสามารถ:

baseKey hKeyLocalMachine = baseKey.HKEY_LOCAL_MACHINE;
uint value = (uint)hKeyLocalMachine;

หรือเพียงแค่:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;

3
มันแปลงสตริงเป็นค่า enum ได้อย่างไร?
Falanwe

Enums ประกอบด้วยสององค์ประกอบ: ชื่อและมูลค่า สมมติว่าชื่อคือ "HKEY_LOCAL_MACHINE" และค่าคือ "0x80000002" วิธี Enum.Parse () ไม่มีประโยชน์ในกรณีนี้เพราะคุณสามารถร่ายสมาชิก enum เป็น uint และรับค่า - 2147483650 แน่นอนว่า Enum.Parse () ให้ผลลัพธ์เดียวกัน แต่แทนที่จะฮาร์ดโค้ดสตริงเป็นพารามิเตอร์ที่คุณสามารถแคสต์ได้ โดยตรงตัวแปร enum ที่คุณกำลังทำงานด้วย
George Findulov

4
คุณไม่ได้แปลงสตริง"HKEY_LOCAL_MACHINE"เป็นค่าตามที่ OP ถามคุณแปลงสัญลักษณ์HKEY_LOCAL_MACHINEเป็นค่า สัตว์ร้ายที่แตกต่างกันอย่างดุเดือด
Falanwe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.