Mặc dù thực sự không thể sử dụng a char
hoặc a string
làm cơ sở cho enum, nhưng tôi nghĩ đây không phải là điều bạn thực sự thích làm.
Giống như bạn đã đề cập, bạn muốn có một loạt các khả năng và hiển thị biểu diễn chuỗi của điều này trong một hộp tổ hợp. Nếu người dùng chọn một trong các biểu diễn chuỗi này, bạn muốn lấy ra enum tương ứng. Và điều này có thể xảy ra:
Đầu tiên, chúng ta phải liên kết một số chuỗi với một giá trị enum. Điều này có thể được thực hiện bằng cách sử dụng DescriptionAttribute
như được mô tả ở đây hoặc ở đây .
Bây giờ bạn cần tạo một danh sách các giá trị enum và các mô tả tương ứng. Điều này có thể được thực hiện bằng cách sử dụng phương pháp sau:
/// <summary>
/// Creates an List with all keys and values of a given Enum class
/// </summary>
/// <typeparam name="T">Must be derived from class Enum!</typeparam>
/// <returns>A list of KeyValuePair<Enum, string> with all available
/// names and values of the given Enum.</returns>
public static IList<KeyValuePair<T, string>> ToList<T>() where T : struct
{
var type = typeof(T);
if (!type.IsEnum)
{
throw new ArgumentException("T must be an enum");
}
return (IList<KeyValuePair<T, string>>)
Enum.GetValues(type)
.OfType<T>()
.Select(e =>
{
var asEnum = (Enum)Convert.ChangeType(e, typeof(Enum));
return new KeyValuePair<T, string>(e, asEnum.Description());
})
.ToArray();
}
Bây giờ bạn sẽ có một danh sách các cặp giá trị khóa của tất cả các enum và mô tả của chúng. Vì vậy, chúng ta hãy chỉ định đây làm nguồn dữ liệu cho một hộp tổ hợp.
var comboBox = new ComboBox();
comboBox.ValueMember = "Key"
comboBox.DisplayMember = "Value";
comboBox.DataSource = EnumUtilities.ToList<Separator>();
comboBox.SelectedIndexChanged += (sender, e) =>
{
var selectedEnum = (Separator)comboBox.SelectedValue;
MessageBox.Show(selectedEnum.ToString());
}
Người dùng thấy tất cả các biểu diễn chuỗi của enum và trong mã của bạn, bạn sẽ nhận được giá trị enum mong muốn.