2010-08-31 27 views
10

Vì vậy, hiện tại có một điều tra được sử dụng trên trạng thái của một ứng dụng. Tuy nhiên, một cái gì đó cảm thấy tắt khi sử dụng nó chống lại ui. Để nhiều chuyển đổi giữa số nguyên và chuỗi khi populating thả xuống. Tôi có thể sử dụng một phương pháp mở rộng hoặc bộ chuyển đổi loại và tiếp tục sử dụng enum đó sẽ là hữu ích nếu một enum có nhiều từ trong đó.Điều gì để sử dụng bên cạnh enum cho C#

Nghĩ rằng tôi muốn hỏi về việc điền vào một lỗ có thể trước khi tôi đào sâu.

Cảm ơn.

+1

Đã 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 –

+0

có đúng là giả sử ui bạn đang sử dụng là với wpf không? –

+0

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

Trả lời

5

Nếu bạn đang làm việc với một biến có số lượng hữu hạn và nổi tiếng về các trạng thái có thể, thì một enum thực sự là cấu trúc chính xác để bạn sử dụng. Có nhiều cách có thể để làm việc với giao diện người dùng thuận tiện hơn và bạn đã trích dẫn hai cách tuyệt vời, đó là các trình chuyển đổi kiểu và các phương thức mở rộng.

14

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:

  1. 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.
  2. 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).
  3. 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; 
+0

Tất cả các đề xuất rất tốt. Bất cứ lúc nào tôi thiết lập một dự án mới, phương thức Parse của tôi luôn được đẩy vào :) –

+0

Yikes! Làm đẹp :-) Tôi có thể yêu cầu phần mở rộng GetDescription của bạn không. Vì mục đích tương tự, tôi đã viết một lớp từ điển đặc biệt với tên của enums, nhưng cách tiếp cận của bạn có vẻ sạch sẽ hơn. – greenoldman

+0

Bằng cách mã hóa cứng tên người dùng có thể nhìn thấy trong mã, bạn cam kết xây dựng lại và phân phối lại toàn bộ ứng dụng, nếu khách hàng quyết định họ muốn xem "Mục 1" thay vì "Mục một". Bạn cũng ngăn không cho hệ thống được bản địa hoá thông qua việc sử dụng các tệp tài nguyên/hội đồng vệ tinh. – mikemanne

0

Một Enum như cấu trúc chắc chắn là sự lựa chọn đúng đắn. Nếu vì một lý do nào đó bạn không muốn sử dụng cách xây dựng quen thuộc, bạn có thể làm cho bạn sở hữu một chức năng hơn.đây là ý tưởng cơ bản:

class Country { 
    private static Country US; 
    private static Country JP 

    static Country() { //initialize static variables } 
    private Country(string name) { //initialize variables of Country instance } 

    } 

Có một mẫu thiết kế cho điều này, nhưng tôi quên tên.

+0

Tôi nhớ làm điều này tại một số điểm nào đó, tuy nhiên điều này thực sự thích hợp hơn với một enum hoặc có sự khác biệt lớn? Enum này cung cấp cho tôi một giá trị số nguyên tương ứng với ID trong cơ sở dữ liệu của tôi, có nghĩa là một chuyển đổi ít hơn. Tắt để làm một số nghiên cứu, cảm ơn. – Aur

Các vấn đề liên quan