static string GetEnumDescription<T>(T value) {
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes =
(DescriptionAttribute[])fi.GetCustomAttributes(
typeof(DescriptionAttribute),
false
);
if (attributes != null &&
attributes.Length > 0) {
return attributes[0].Description;
}
else {
return value.ToString();
}
}
static T ParseDescriptionToEnum<T>(string description) {
Array array = Enum.GetValues(typeof(T));
var list = new List<T>(array.Length);
for(int i = 0; i < array.Length; i++) {
list.Add((T)array.GetValue(i));
}
var dict = list.Select(v => new {
Value = v,
Description = GetEnumDescription(v) }
)
.ToDictionary(x => x.Description, x => x.Value);
return dict[description];
}
No hice ningún intento de comprobación de errores. Tenga en cuenta que no es necesario crear el diccionario en cada llamada al método, pero soy demasiado perezoso para solucionarlo.
Uso:
enum SomeEnum {
[Description("First Value")]
FirstValue,
SecondValue
}
SomeEnum value = ParseDescriptionToEnum<SomeEnum>("First Value");
Una prueba que pasa:
[Fact]
public void Can_parse_a_value_with_a_description_to_an_enum() {
string description = "First Value";
SomeEnum value = ParseDescriptionToEnum<SomeEnum>(description);
Assert.Equal(SomeEnum.FirstValue, value);
}
[Fact]
public void Can_parse_a_value_without_a_description_to_an_enum() {
string description = "SecondValue";
SomeEnum value = ParseDescriptionToEnum<SomeEnum>(description);
Assert.Equal(SomeEnum.SecondValue, value);
}
posible duplicado de [¿Puede acceder a una descripción larga para un valor de enumeración específico.] (Http://stackoverflow.com/questions/1473870/can-you-access-a-long-description-for-a-specific -enum-value) – NotMe