这是过度使用扩展方法吗?
本文关键字:扩展 方法 | 更新日期: 2023-09-27 18:13:56
我希望使某些功能尽可能通用。
在我的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转换透明度会更好吗?
您可以将IDictionary<,>
直接绑定到DropDownList
DataSource
,在WebForms中您需要指定像DataValueField="Key"
和DataTextField="Value"
这样的映射。考虑到为什么不直接使用LINQ ToDictionary()
方法?
dropDownList.DataValueField = "Key";
dropDownList.DataTextField = "Value";
dropDownList.DataSource =
SessionTypes.ToDictionary(k => k.ID.ToString(),
v => v.Title);
本指南来自c# in Depth:
"一个扩展方法是合理有效的,如果它适用于所有扩展类型的实例。如果只是在某些情况下是合适的情况下,然后明确该方法不是类型by的一部分将其保留为"普通的"静态方法。
只要您可以在IEnumerable类型的所有实例上公开此扩展方法,那么您就可以开始了。
在一个轻松的注释中,我宁愿将扩展方法称为ToSelectListItem
,而不是ToSelectList
,以使最终用户更清楚。这也是我个人的偏好
这是一个完全可以接受的扩展方法的用法。
只要他们是描述性的命名,并按照他们说的做,你应该没有问题。