我见过一些使用'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;
}
SOLUTION
,我使用的溶液:
用法
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;
}
}
Ofcourse! 谢谢。我一直在想着那些带有'T'的样本,我没有意识到我所需要的界面。非常感谢。 – 2009-05-06 08:52:54
我会说在这种情况下使用泛型和函数将是一个更好的事情。然后你不必强制一堆类来实现一个接口。您可能希望在没有ID或说明的类上使用该ToSelectList函数,并且添加它的位置不是很合乎逻辑(或者例如,Description属性实际上应该被称为其他内容)。 – Svish 2009-05-06 09:10:53