Hãy tưởng tượng chúng ta có một enum:Chuyển đổi một số nguyên cho một loại enum đóng hộp duy nhất được biết trong thời gian chạy
enum Foo { A=1,B=2,C=3 }
Nếu loại được biết đến tại thời gian biên dịch, một dàn diễn viên trực tiếp có thể được sử dụng để thay đổi giữa enum- loại và các loại cơ bản (thường int
):
static int GetValue() { return 2; }
...
Foo foo = (Foo)GetValue(); // becomes Foo.B
và boxing này đưa ra một hộp loại Foo
:
object o1 = foo;
Console.WriteLine(o1.GetType().Name); // writes Foo
(và trên thực tế, bạn có thể hộp như Foo
và Unbox như int
, hoặc hộp như int
và Unbox như Foo
khá hạnh phúc)
Tuy nhiên (vấn đề); nếu kiểu enum chỉ được biết ở những thứ thời gian chạy thì ... phức tạp hơn. Nó rõ ràng là tầm thường để hộp nó như là một int
- nhưng tôi có thể hộp nó như Foo
? (Lý tưởng nhất là không sử dụng generics và MakeGenericMethod
, mà sẽ là xấu xí). Convert.ChangeType
ném một ngoại lệ. ToString
và Enum.Parse
hoạt động, nhưng là khủng khiếp không hiệu quả.
Tôi có thể xem các giá trị đã xác định (Enum.GetValues
hoặc Type.GetFields
), nhưng điều đó rất khó cho [Flags]
và thậm chí không cần quay trở lại kiểu đầu tiên (không khó, may mắn).
Nhưng; có trực tiếp hơn để lấy giá trị của kiểu cơ bản đúng cho một hộp kiểu enum không, trong đó kiểu chỉ được biết khi chạy?
Làm thế nào các | $ (* &% $ (Tôi đã bỏ lỡ điều đó! Cảm ơn, đó là chính xác những gì tôi muốn. –
Dễ dàng bỏ lỡ. Có vẻ như một tên phương pháp khủng khiếp. Một cái gì đó như 'Enum.FromValue' có thể có –