我想知道我如何能够创建一个可重用的方法来创建基于方法参数的选择列表?我在想像下面这样的事情:
public IEnumerable<SelectListItem> CreateSelectList(IList<T> entities, T value, T text)
{
return entities
.Select(x => new SelectListItem
{
Value = x.value.ToString(),
Text = x.text.ToString()
});
}
我觉得我有点倒退了。我不确定如何调用这样的方法,当我使用类别的 IList 作为第一个参数调用它时,编译器抱怨它不能将类别类型分配给类型 T?另外,我如何将方法参数插入到 lambda 中?任何帮助表示赞赏!
我试图用来调用它的代码(这是错误的,但你明白了)
viewModel.Categories = _formServices.CreateSelectList(categories, Id, Name);
我试图使代码更通用和可重用的代码:
viewModel.Categories = categories
.Select(x => new SelectListItem
{
Value = x.Id.ToString(),
Text = x.Name
});
编辑答案
归功于@Pavel Backshy 的工作答案。我想编辑我对他的回答所做的扩展,以防它帮助任何人!该扩展只是在组合中添加了一个 .Where 子句:
public IEnumerable<SelectListItem> CreateSelectListWhere<T>(IList<T> entities, Func<T, bool> whereClause, Func<T, object> funcToGetValue, Func<T, object> funcToGetText)
{
return entities
.Where(whereClause)
.Select(x => new SelectListItem
{
Value = funcToGetValue(x).ToString(),
Text = funcToGetText(x).ToString()
});
}