Nhóm của tôi gặp sự cố này trong dự án gần đây của chúng tôi. Chúng tôi giữ các enums, vì chúng là thứ để sử dụng cho một danh sách hữu hạn các giá trị không đổi, nhưng chúng tôi đã làm một vài điều để làm cho chúng thân thiện với nhà phát triển hơn:
- Chúng tôi đã trang trí các giá trị enum với [Mô tả (Mô tả))] thuộc tính có chứa "tên thân thiện" của mỗi hằng số enum.
- Chúng tôi đã tạo phương thức mở rộng GetDescription() sẽ kiểm tra phản ánh thuộc tính Mô tả của hằng số enum và trả lại tên thân thiện. Nếu nó không có, phương thức sẽ cố gắng chèn dấu cách vào ToString() của tên hằng số enum. Vì các hằng số của CamelCased enum là một yêu cầu kiểu được thực thi bởi ReSharper, điều này làm việc cho khoảng 90% các hằng số của chúng ta, và các thuộc tính Description xử lý phần còn lại (hầu hết các từ viết tắt viết hoa trong tên).
- Chúng ta đã tạo ra một phương thức mở rộng chung ParseEnum() cho các chuỗi về cơ bản kết thúc tốt đẹp Enum.Parse() (là không rõ ràng; đòi hỏi chỉ định kiểu Enum trong phương thức và sau đó đúc nó). Tôi nghĩ rằng nó có thể đủ thông minh để thử tìm kiếm các thuộc tính mô tả đầu tiên, nếu không chúng ta chỉ cần sử dụng biểu diễn ToString() vẫn có thể đọc được làm giá trị dữ liệu của mục thả xuống.
Vì vậy, được đưa ra như sau:
public enum MyItems
{
[Description("Item One")]
ItemOne,
[Description("Item Two")]
ItemTwo,
[Description("Item Three")]
ItemThree
}
chúng ta có thể cư một DropDownList với lựa chọn sử dụng trong hai dòng:
foreach(MyValues value in Enum.GetValues<MyValues>())
myDDL.Items.Add(New ListItem(value.GetDescription(), value.ToString())
... và sau đó chúng ta có thể phân tích các lựa chọn trở lại với mã rất dễ đọc:
var theValue = myDDL.SelectedItem.Value.ParseEnum<MyValues>()
EDIT: Tôi đã được yêu cầu phương thức GetDescription(). Tôi là một chút iffy về chia sẻ toàn bộ điều, nhưng đây là thuật toán cơ bản để có được một thuộc tính mô tả trang trí một hằng số enum. Phân tích một tên CamelCased khá đơn giản RegEx chia tách trên các chữ cái viết hoa, và việc thực hiện của chúng ta là một chút ngây thơ. đoạn này đòi hỏi System.ComponentModel.DescriptionAttribute (mà cũng là trang trí cho hằng enum), và enumType là "này" tham số của phương pháp mở rộng, kiểu Enum:
var attr = enumType.GetType().GetField(enumType.ToString())
.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attr.Length > 0)
return ((DescriptionAttribute)attr[0]).Description;
Đã có câu hỏi tương tự, không liên quan với một số câu trả lời hay: http://stackoverflow.com/questions/1970594/enums-or-tables –
có đúng là giả sử ui bạn đang sử dụng là với wpf không? –
Bạn có phản đối việc chỉ viết một lớp tĩnh có thể làm điều tương tự để bạn có thể tránh các vấn đề quyền anh? – joshlrogers