У меня есть расширение для преобразования Enum в SelectList следующим образом:Карта Enum пункты анонимного типа
public static SelectList ToSelectList(this Enum value, Object selected = null) {
return new SelectList(Enum.GetValues(value.GetType()).Cast<Enum>().Select(x =>
new {
Value = Convert.ToInt32(x),
Description = x.Attribute<DescriptionAttribute>().Description }
), "Value", "Description", selected);
}
Это применяется следующим образом:
Countries = new CountryEnum().ToSelectList(currentCountry);
Это прекрасно работает, но в некоторых случаях мне нужно удалить элемент из списка перечислений или использовать другой порядок, и я не могу это сделать в данный момент.
Поэтому я хотел бы иметь что-то более гибкое. Например:
new CountryEnum()
.Map(x => new {
Value = Convert.ToInt32(x),
Name = x.Attribute<DescriptionAttribute>().Description
)
.OrderBy(x => x.Description)
.Remove(x => x.Id > 30)
.ToSelectList(...
Поэтому в основном я хотел бы иметь метод расширения Enum, который картирование перечисления в IEnumerable анонимного типа, который будет использоваться другими методами.
Имеет ли это смысл? Как я могу это сделать?
UPDATE 1
Я попытался следующие:
public static IEnumerable<T> Map<T>(this Enum value, Func<Enum, T> expression) {
Type type = value.GetType();
IEnumerable<Enum> items = new List<Enum> { value };
foreach (Enum item in items)
yield return expression(item);
} // Map
, а затем использовать следующее:
var items = new CountryEnum().Map(x => new { Id = Convert.ToInt32(x) });
Но это возвращает 0 ...
UPDATE 2
Я думаю, что решить карту часть следующим образом:
public static IEnumerable<T> Map<T>(this Enum value, Func<Enum, T> expression) {
Type type = value.GetType();
var items = Enum.GetValues(type).Cast<Enum>();
foreach (Enum item in items)
yield return expression(item);
}
Теперь я могу использовать его следующим образом:
new CountryType()
.Map(x => new {
Id = Convert.ToInt32(x),
Description = x.Attribute<DescriptionAttribute>().Description })
.OrderBy(x => x.Description);
Теперь то, что я пропускаю это метод расширения, чтобы преобразовать это в a SelectList.
В настоящее время расширение у меня есть:
public static SelectList ToSelectList(this Enum value, Object selected = null) {
return new SelectList(Enum.GetValues(value.GetType()).Cast<Enum>().Select(x => new { Value = Convert.ToInt32(x), Description = x.Attribute<DescriptionAttribute>().Description }), "Value", "Description", selected);
} // ToSelectList
Так что я хотел бы создать расширение, которое будет применяться после карты одного.
Почему не просто метод расширения, который отображает любое перечисление на IEnumerable>? Почему анонимный тип в счетчике? –
olitee
Это имело бы смысл, если бы я всегда хотел только имя и имя Enum. Но иногда мне нужно Enum Id, Name, Description и, возможно, еще один атрибут. –
Я думаю, что все, что вам нужно сделать, это добавить параметры для имен значений и текстовых полей, которые будут переданы конструктору 'SelectedList'. – juharr