¡Creo que su código es hermoso!
La única mejora sería colocar el código en un Método de extensión.
EDIT:
Cuando pienso en ello, lo que se quiere hacer es usar la Enum
como en la definición y no una instancia de la enumeración, que es requerido por los métodos de extensiones.
encontré este question, que lo resuelve muy bien:
public class SelectList
{
// Normal SelectList properties/methods go here
public static Of<T>()
{
Type t = typeof(T);
if (t.IsEnum)
{
var values = from Enum e in Enum.GetValues(type)
select new { ID = e, Name = e.ToString() };
return new SelectList(values, "Id", "Name");
}
return null;
}
}
// called with
var list = SelectList.Of<Things>();
Sólo es posible que desee devolver un Dictionary<int, string>
y no un SelectList
, pero usted consigue la idea.
Edit2:
Aquí vamos con un ejemplo de código que cubre el caso que usted está mirando.
public class EnumList
{
public static IEnumerable<KeyValuePair<T, string>> Of<T>()
{
return Enum.GetValues(typeof (T))
.Cast<T>()
.Select(p => new KeyValuePair<T, string>(p, p.ToString()))
.ToList();
}
}
O quizá esta versión, donde la clave es una int
public class EnumList
{
public static IEnumerable<KeyValuePair<int, string>> Of<T>()
{
return Enum.GetValues(typeof (T))
.Cast<T>()
.Select(p => new KeyValuePair<int, string>(Convert.ToInt32(p), p.ToString()))
.ToList();
}
}
¿Por qué está buscando una solución más simple si su solución funciona? –
@ Ramhound: Pensé que tal vez hay una forma * directa *. Entiendo mi código, pero no todos pueden hacer eso simplemente. Así que busqué uno más simple. – Homam
@Homam No sé si tu intención era esa, pero cuando diseñé el código para mi propia solución tuve que invertir la clave y los tipos de valores en mi declaración de selección para mostrar correctamente el valor en el cuadro combinado. Su método terminó mostrando las claves en el cuadro combinado. – gonzobrains