В начале мы имеем это базовое перечисление.
public enum E_Levels {
[ValueOfEnum("Low level")]
LOW,
[ValueOfEnum("Normal level")]
NORMAL,
[ValueOfEnum("High level")]
HIGH
}
И я хотел бы получить List<string>
все перечисление. Что-то вроде Extensions.GetValuesOfEnum<E_Levels>()
, которое могло бы вернуть List<string>
с "низким уровнем", "нормальным уровнем" и "высоким уровнем" в нем.
StackOF помог мне получить атрибут value one:
public static class Extensions {
public static string ToValueOfEnum(this Enum value) {
FieldInfo fieldInfo = value.GetType().GetField(value.ToString());
ValueOfEnum[] attribs = fieldInfo.GetCustomAttributes(typeof(ValueOfEnum), false) as ValueOfEnum[];
return attribs.Length > 0 ? attribs[0].value : null;
}
}
И я могу вызвать этот метод независимо от перечисления: E_Levels.LOW.ToValueOfEnum()
.
Кроме того, StackOF помог мне получить List<string>
для конкретного перечисления.
Я сделал этот метод в контроллере:
private List<string> GetLevels() {
List<string> levelsToReturn = new List<string>();
var levels = Enum.GetValues(typeof(E_Levels)).Cast<E_Levels>();
foreach(E_Levels l in levels)
levelsToReturn.Add(l.ToValueOfEnum());
return levelsToReturn;
}
Но этот способ требует, чтобы я переписал один и тот же метод для каждого перечисления.
Поэтому я попытался добавить этот общий метод в мои расширения класса:
public static class Extensions {
public static string ToValueOfEnum(this Enum value) {...}
public static List<string> GetValuesOf<T>() {
List<string> levelsToReturn = new List<string>();
var levels = Enum.GetValues(typeof(T)).Cast<T>();
foreach(T l in levels)
levelsToReturn.Add(l.ToValueOfEnum());
return levelsToReturn;
}
}
Но в моем foreach .ToValueOfEnum()
- неизвестный метод.
Так что у меня проблемы, я надеялся, что смогу найти способ не переписывать снова и снова тот же метод для каждого перечисления...