【发布时间】:2011-11-07 13:38:14
【问题描述】:
我希望使某些函数尽可能通用。
在我的 MVC 应用程序中,我必须将一些复杂的 IEnumerable 对象转换为 SelectLists 以进行下拉显示等。
起初,我创建了一个静态 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 转换来提高透明度会更好吗?
【问题讨论】:
标签: c# asp.net-mvc linq linq-to-objects func