Cette réponse ne sera probablement jamais vue parmi toutes les autres réponses, mais voici le code que j'ai trouvé, qui a l'avantage d'utiliser l'attribut DescriptionAttribute
si elle existe, mais sinon en utilisant le nom de la valeur de l'enum elle-même.
J'ai utilisé un dictionnaire parce qu'il a un modèle clé/valeur tout fait. A List<KeyValuePair<string,object>>
fonctionnerait également, sans le hachage inutile, mais un dictionnaire permet d'obtenir un code plus propre.
J'ai des membres qui ont un MemberType
de Field
et qui sont littérales. Cela crée une séquence composée uniquement de membres qui sont des valeurs d'énumération. Ceci est robuste puisqu'un enum ne peut pas avoir d'autres champs.
public static class ControlExtensions
{
public static void BindToEnum<TEnum>(this ComboBox comboBox)
{
var enumType = typeof(TEnum);
var fields = enumType.GetMembers()
.OfType<FieldInfo>()
.Where(p => p.MemberType == MemberTypes.Field)
.Where(p => p.IsLiteral)
.ToList();
var valuesByName = new Dictionary<string, object>();
foreach (var field in fields)
{
var descriptionAttribute = field.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute;
var value = (int)field.GetValue(null);
var description = string.Empty;
if (!string.IsNullOrEmpty(descriptionAttribute?.Description))
{
description = descriptionAttribute.Description;
}
else
{
description = field.Name;
}
valuesByName[description] = value;
}
comboBox.DataSource = valuesByName.ToList();
comboBox.DisplayMember = "Key";
comboBox.ValueMember = "Value";
}
}