我看过一些使用“T”使方法可重用于不同类的泛型集合的示例,但我从未真正深入了解或理解这些示例。
我想知道是否可以将下面的 2 种方法合二为一,这样做的缺点是什么(性能方面)。
有人吗?
[NonAction]
public List<SelectListItem> ToSelectList(IEnumerable<Department> departments, string defaultOption)
{
var items = departments.Select(d => new SelectListItem() { Text = d.Code + " - " + d.Description, Value = d.Id.ToString() }).ToList();
items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
return items;
}
[NonAction]
public List<SelectListItem> ToSelectList(IEnumerable<Function> functions, string defaultOption)
{
var items = functions.Select(f => new SelectListItem() { Text = f.Description, Value = f.Id.ToString() }).ToList();
items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
return items;
}
解决方案
我使用的解决方案:
用法
var departmentItems = departments.ToSelectList(d => d.Code + " - " + d.Description, d => d.Id.ToString(), " - ");
var functionItems = customerFunctions.ToSelectList(f => f.Description, f => f.Id.ToString(), " - ");
与
public static class MCVExtentions
{
public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption)
{
var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList();
items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
return items;
}
}
最佳答案
老派的方法是为部门和职能部门创建一个通用接口(interface):
interface A
{
int ID{get;}
string Description{get;}
}
您在 Department 上实现 Description 以返回 d.Code + "- "+ d.Description
。
并编写函数以使用此接口(interface)而不是具体类:
[NonAction]
public List<SelectListItem> ToSelectList(IEnumerable<A> as, string defaultOption)
{
var items = as.Select(a => new SelectListItem() { Text = a.Description, Value = a.Id.ToString() }).ToList();
items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
return items;
}
编辑:关于使用泛型,在这种情况下不会有太大帮助,因为
- 您传递的对象需要实现 Id 和 Description
- 你不会返回这些对象,所以在这方面你不必关心泛型的类型安全
关于c# - 如何将这两种相似的方法重构为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/828624/