Làm cách nào để lấy giá trị enum từ chuỗi trong C #?


102

Tôi có một enum:

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

Làm cách nào tôi có thể, đã cho chuỗi HKEY_LOCAL_MACHINE, nhận giá trị 0x80000002dựa trên enum?

Câu trả lời:


173
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 */ }

Trước .NET 4.5, bạn phải thực hiện những việc sau, thao tác này dễ xảy ra lỗi hơn và ném một ngoại lệ khi một chuỗi không hợp lệ được truyền:

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

1
Tôi luôn tự hỏi tại sao vẫn không có quá tải chung cho Enum.Parse. Đã quá hạn lâu rồi.
Falanwe

3
Bây giờ có phương thức Enum.TryParse <TEnum> () chung.
Eugene Maksimov

27

Sử dụng Enum.TryParse bạn không cần xử lý Exception:

baseKey e;

if ( Enum.TryParse(s, out e) )
{
 ...
}

20
var value = (uint) Enum.Parse(typeof(baseKey), "HKEY_LOCAL_MACHINE");  

16

Với một số lỗi xử lý ...

uint key = 0;
string s = "HKEY_LOCAL_MACHINE";
try
{
   key = (uint)Enum.Parse(typeof(baseKey), s);
}
catch(ArgumentException)
{
   //unknown string or s is null
}

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

Đoạn mã này minh họa việc lấy giá trị enum từ một chuỗi. Để chuyển đổi từ một chuỗi, bạn cần sử dụng Enum.Parse()phương thức tĩnh , phương thức này có 3 tham số. Đầu tiên là loại enum bạn muốn xem xét. Cú pháp là từ khóa typeof()theo sau là tên của lớp enum trong ngoặc. Tham số thứ hai là chuỗi được chuyển đổi và tham số thứ ba là boolchỉ báo bạn có nên bỏ qua chữ hoa chữ thường trong khi thực hiện chuyển đổi hay không.

Cuối cùng, hãy lưu ý rằng Enum.Parse()thực sự trả về một tham chiếu đối tượng, điều đó có nghĩa là bạn cần chuyển đổi rõ ràng nó thành kiểu enum bắt buộc ( string, intv.v.).

Cảm ơn bạn.


-2

Giải pháp thay thế có thể là:

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

Hoặc chỉ:

uint value = (uint)baseKey.HKEY_LOCAL_MACHINE;

3
Làm thế nào chính xác mà điều đó chuyển đổi một chuỗi thành giá trị enum?
Falanwe

Enums bao gồm hai thành phần: tên và giá trị. Giả sử tên là "HKEY_LOCAL_MACHINE" và giá trị là "0x80000002". Phương thức Enum.Parse () vô dụng trong trường hợp này vì bạn có thể ép kiểu thành viên enum thành uint và nhận giá trị - 2147483650. Enum.Parse () tất nhiên cho kết quả tương tự nhưng thay vì mã hóa một chuỗi thành một tham số, bạn có thể ép kiểu trực tiếp biến enum mà bạn đang làm việc.
George Findulov

4
Bạn đã không chuyển đổi chuỗi "HKEY_LOCAL_MACHINE"thành giá trị, như OP yêu cầu, bạn đã chuyển đổi biểu tượng HKEY_LOCAL_MACHINEthành giá trị. Dã thú khác người.
Falanwe
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.