Я хочу сделать некоторые функции как можно более общими.
В моих приложениях MVC мне нужно преобразовать ряд сложных объектов IEnumerable в списки выбора для отображения раскрывающегося списка и т. Д.
ВСначала я создал статический класс List с методами преобразования для каждого сложного объекта.Это составило много кода.Затем я начал использовать операторы linq для выполнения преобразования:
var list = (from o in SessionTypes select new SelectListItem { Value = o.ID.ToString(), Text = o.Title }).ToList();
, но опять же, это было много кода, когда было выполнено много таких преобразований.
Я наконец-то решил что-то похожее на:
public IEnumerable<SelectListItem> ToSelectList<T>(IEnumerable<T> enumerable, Func<T, string> value, Func<T, string> text)
{
return enumerable.Select(f => new SelectListItem()
{
Value = value(f),
Text = text(f),
});
}
и, чтобы его было проще использовать, я сделал метод расширения:
public static IEnumerable<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> value, Func<T, string> text)
{
return enumerable.Select(f => new SelectListItem()
{
Value = value(f),
Text = text(f),
});
}
Итак, теперь всеЯ должен сделать это:
var list = SessionTypes.ToSelectList(o => o.ID.ToString(), o => o.Title) as List<SelectListItem>;
У меня есть аналогичные методы, такие как .ToDictionary тоже.
Это чрезмерное использование методов расширения?Я беспокоюсь, что я прячу слишком много кода в методах расширения, которые могут искажать мои модели. Было бы лучше использовать преобразования linq для прозрачности?