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