Anche se non è davvero possibile usare a char
o a string
come base per un enum, penso che questo non sia ciò che ti piace davvero fare.
Come hai detto, ti piacerebbe avere un elenco di possibilità e mostrare una rappresentazione di stringa di questo all'interno di una casella combinata. Se l'utente seleziona una di queste rappresentazioni di stringa, desideri ottenere l'enumerazione corrispondente. E questo è possibile:
Per prima cosa dobbiamo collegare una stringa a un valore enum. Questo può essere fatto usando il DescriptionAttribute
modo descritto qui o qui .
Ora è necessario creare un elenco di valori enum e descrizioni corrispondenti. Questo può essere fatto utilizzando il seguente metodo:
/// <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();
}
Ora avrai un elenco di coppie di valori chiave di tutte le enumerazioni e la loro descrizione. Quindi assegniamolo semplicemente come origine dati per una casella combinata.
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());
}
L'utente vede tutte le rappresentazioni di stringa dell'enumerazione e all'interno del codice otterrai il valore dell'enumerazione desiderato.