2010-07-02 34 views
5

Tôi có một enum:C# Bật enums

public enum Status 
{ 
    Incomplete = 1, Complete = 2, Cancelled = 3, Deleted = 4 
} 

Bây giờ trên một trang nhất định tôi muốn liệt kê enum này trong CheckBoxList. Điều này sẽ được tốt ngoại trừ việc tôi muốn văn bản của mỗi hộp kiểm để hiển thị văn bản khác với enum.

tức là hộp kiểm nên nói:

"không được xử lý" thay vì "Incomplete"

"Đã xử lý" thay vì "Complete"

"Void" thay vì "hủy"

Có thể đặt enum này vào một foreach và sau đó chuyển sang trạng thái và cập nhật văn bản. Giống như vậy:

var statuses = Enum.GetNames(typeof(Status)); 
foreach (var status in statuses))) 
{ 
    switch (status) 
    { 
     case Status.Complete.ToString(): 
     status = "Processed"; 
     break; ...etc     
    } 
} 

Bất kỳ ý tưởng nào cũng sẽ được đánh giá cao.

Trả lời

14

C# có tính năng ngôn ngữ trực tiếp giải quyết câu hỏi của bạn. Here's an article cung cấp cho bạn chi tiết đầy đủ.

Phiên bản ngắn: áp dụng giá trị thuộc tính mở rộng của mỗi giá trị:

enum OrderStatus 
{ 
    [EnumValueData(Name="New Order")] 
    NewOrder = 1, 
    [EnumValueData(Name="In Process")] 
    Processing = 2, 
    [EnumValueData(Name="Shipped")] 
    Shipped = 3 
} 

Sau đó áp dụng cho biết giá trị radio-nút của bạn, hộp danh sách hoặc bất cứ điều gì:

public static Dictionary<int, string> GetListItems(Type enumType) 
{ 
    if (!enumType.IsEnum) 
     throw new ApplicationException("GetListItems does not support non-enum types"); 
    Dictionary<int, string> list = new Dictionary<int, string>(); 
    foreach(FieldInfo field in enumType.GetFields(BindingFlags.Static | BindingFlags.GetField | BindingFlags.Public)) 
    { 
     int value; 
     string display; 
     value = (int)field.GetValue(null); 
     display = Enum.GetName(enumType, value); 
     foreach(Attribute currAttr in field.GetCustomAttributes(true)) 
     { 
      EnumValueDataAttribute valueAttribute = currAttr as EnumValueDataAttribute; 
      if (valueAttribute != null) 
       display = valueAttribute.Name; 
     } 
     list.Add(value, display); 
    } 
    return list; 
} 
+10

Dường như với tôi đây là tạo thuộc tính mới (EnumValueDataAttribute) cho thuộc tính đã tồn tại (System.ComponentModel.DescriptionAttribute). Nó hoạt động nhưng tôi hỏi tại sao bạn sẽ tạo một cái mới thay vì sử dụng DescriptionAttribute? – TLiebe

+0

@ TLiebe - điểm tốt. Tôi là nạn nhân của nhiều năm tiêu chuẩn mã hóa giả tạo. Đây là cách mà các nhà phát triển mà tôi tham gia đã làm. Tôi không phá vỡ mô hình; làm cho các đánh giá mã khó chịu! :) –

0

Bạn có thể đặt chuỗi Modification của bạn trong một mảng và sau đó sử dụng chỉ mục enum để truy cập phần tử mảng.

10

Bạn có thể sử dụng Description attribute trong lớp System.ComponentModel để gán mô tả văn bản cho mỗi giá trị enum. Sau đó, bạn có thể đặt thuộc tính văn bản bằng cách lặp qua enum và nhận thuộc tính Mô tả của mỗi thay vì sử dụng nút chuyển.

public enum Status 
{ 
    [Description("Not Processed")] Incomplete = 1, 
    [Description("Processed")] Complete = 2, 
    [Description("Void")] Cancelled = 3, 
    Deleted = 4 
} 

Sau đó bạn có thể sử dụng giống như sau để có được những mô tả của một giá trị enum đơn (hoặc sửa đổi nó để trả lại một từ điển của như Bob cho thấy trong ví dụ của mình):

public static string GetEnumDescription (Object value) 
    { 
     try 
     { 
      Type objType = value.GetType(); 
      FieldInfo fldInf = objType.GetField(Enum.GetName(objType, value)); 

      Object[ ] attributes = fldInf.GetCustomAttributes(false); 

      if (attributes.Length > 0) 
      { 
       DescriptionAttribute descAttr = (DescriptionAttribute)attributes[ 0 ]; 
       return descAttr.Description; 
      } 
      else 
      { 
       return value.ToString(); 
      } 
     } 
     catch 
     { 
      return string.Empty; 
     } 
    } 
+1

Tôi có thể nitpick không? Chỉ muốn chỉ ra rằng, trong mã "thực", bạn có thể muốn cái gì đó mạnh mẽ hơn các thuộc tính [0]. Ngoài ra, tôi khá chắc chắn rằng thử/bắt tinh khiết ác, nhưng có những chủ đề khác về chủ đề đó. Tôi sẽ thử giải pháp này trong tương lai. Cám ơn vì đã chia sẻ! – apollodude217

+0

Xây dựng nitpicking luôn được chào đón. Điểm của bạn là tốt và trong khi tôi sẽ thừa nhận mã là của riêng tôi, tôi sẽ bảo vệ bản thân mình với lý do (thừa nhận là nghèo) rằng nó cũ và từ một số mã .NET đầu tiên tôi viết. – TLiebe