我已经看到一些使用'T'的样本来使一个方法可以重复用于不同类的泛型集合,但我从来没有真正深入到它或理解样本。
我想知道是否可以将下面的两种方法放在一起,这样做的缺点是(性能方面)。
任何?
[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;
}
}
答案 0 :(得分:8)
旧学校的方式是为Department和Function创建一个通用界面:
interface A
{
int ID{get;}
string Description{get;}
}
您在部门上实施说明以返回d.Code + " - " + d.Description
。
并编写函数来使用这个接口而不是具体的类:
[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;
}
编辑:关于使用泛型,在这种情况下它不会有太多帮助,因为
答案 1 :(得分:7)
如果没有实现@Grzenio建议的通用界面,你可以使用这样的通用方法:
public List<SelectListItem> ToSelectList<T>(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;
}
// use like
t.ToSelectList(departments, d => d.Code + " - " + d.Description, d => d.Id.ToString(), "default");
t.ToSelectList(functions, f => f.Description, f => f.Id.ToString(), "default");
答案 2 :(得分:4)
事实上,你可以使用泛型和函数的组合来做这些事情(未经测试甚至可能无法编译)。
[NonAction]
public List<SelectListItem> ToSelectList<T>(IEnumerable<T> en,
Function<string, T> text,
Function<string, T> value,
string defaultOption)
{
var items = en.Select(x => new SelectListItem() { Text = text(x) , Value = value(x) }).ToList();
items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
return items;
}
然后你可以使用适当的lambda函数(或直接调用)发送给它。
[NonAction]
public List<SelectListItem> ToSelectList(IEnumerable<Department> departments,
string defaultOption)
{
return ToSelectList<Department>(departments, d => d.Code + '-' + d.Description, d => d.Id.ToString(), defaultOption);
}