Хотя действительно невозможно использовать a char
или a string
в качестве основы для перечисления, я думаю, что это не то, что вам действительно нравится.
Как вы упомянули, вы хотели бы иметь перечень возможностей и показать их строковое представление в поле со списком. Если пользователь выбирает одно из этих строковых представлений, вы хотите получить соответствующее перечисление. А это возможно:
Сначала мы должны связать некоторую строку со значением перечисления. Это можно сделать, используя то, DescriptionAttribute
что описано здесь или здесь .
Теперь вам нужно создать список значений перечисления и соответствующих описаний. Это можно сделать следующим способом:
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();
}
Теперь у вас будет список пар ключ-значение всех перечислений и их описание. Так что давайте просто назначим это как источник данных для поля со списком.
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());
}
Пользователь видит все строковые представления перечисления, и в вашем коде вы получите желаемое значение перечисления.