To, co myślę, że zmagasz się, to odzyskanie opisu. Jestem pewien, że gdy już masz te, które możesz zdefiniować swoją ostateczną metodę, która daje dokładny wynik.
Po pierwsze, jeśli zdefiniujesz metodę rozszerzenia, działa ona na wartości wyliczenia, a nie na samym typie wyliczenia. I myślę, że dla łatwego użycia, chciałbyś wywołać metodę na typie (jak metoda statyczna). Niestety nie możesz tego zdefiniować.
Co możesz zrobić, to: Najpierw zdefiniować metodę, która pobiera opis wartości enum, jeśli ma jedną:
public static string GetDescription(this Enum value) {
string description = value.ToString();
FieldInfo fieldInfo = value.GetType().GetField(description);
DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes != null && attributes.Length > 0) {
description = attributes[0].Description;
}
return description;
}
Następnie zdefiniować metodę, która przyjmuje wszystkie wartości wyliczenia i korzystania z poprzedniej metody, aby sprawdzić wartość którą chcesz pokazać i zwrócić tę listę. Ogólny argument można wywnioskować.
public static List<KeyValuePair<TEnum, string>> ToEnumDescriptionsList<TEnum>(this TEnum value) {
return Enum
.GetValues(typeof(TEnum))
.Cast<TEnum>()
.Select(x => new KeyValuePair<TEnum, string>(x, ((Enum)((object)x)).GetDescription()))
.ToList();
}
Wreszcie, dla ułatwienia użytkowania, metoda wywoływania go bezpośrednio bez wartości. Ale ogólny argument nie jest opcjonalny.
public static List<KeyValuePair<TEnum, string>> ToEnumDescriptionsList<TEnum>() {
return ToEnumDescriptionsList<TEnum>(default(TEnum));
}
Teraz możemy używać go tak:
enum TestEnum {
[Description("My first value")]
Value1,
Value2,
[Description("Last one")]
Value99
}
var items = default(TestEnum).ToEnumDescriptionsList();
// or: TestEnum.Value1.ToEnumDescriptionsList();
// Alternative: EnumExtensions.ToEnumDescriptionsList<TestEnum>()
foreach (var item in items) {
Console.WriteLine("{0} - {1}", item.Key, item.Value);
}
Console.ReadLine();
które wyjścia:
Value1 - My first value
Value2 - Value2
Value99 - Last one
Dzięki za szczegółowe odpowiedzi:) Szczerze mówiąc, chcę po prostu czegoś naprawdę prostego (jeśli to możliwe), więc mogę użyć 'eChargeType.ToSelectList()' - Zmniejszyłem złożoność mojego przykładu, aby wykluczyć 'DescriptionAttribute', ponieważ może to być niepotrzebnym zamieszaniem. Dzięki! – Jimbo
Niestety, 'eChargeType.ToSelectList()' nie jest możliwe, ponieważ chcesz dodać metodę statyczną do typu wyliczeniowego. A to nie jest możliwe, ale możesz gdzieś stworzyć statyczną metodę pomocnika. – Maarten
W odniesieniu do powyższego komentarza, czy możesz rzucić światło na to, co autor tego postu miał nadzieję osiągnąć? http://stackoverflow.com/a/276589/175893 Myślałem, że jesteśmy w tej samej misji! Dzięki – Jimbo