Dan*_*Dan 13 c# generics extension-methods
对于仿制药我是新的(好的,真的很新),但我喜欢它们的想法.我将在视图上有一些下拉列表,我想要一个通用的方法来获取对象列表并将其转换为列表SelectListItems
我现在拥有的:
public static IEnumerable<SelectListItem> ToSelectListItems(
this IEnumerable<SpecificObject> items, long selectedId)
{
return
items.OrderBy(item => item.Name)
.Select(item =>
new SelectListItem
{
Selected = (item.Id == selectedId),
Text = item.Name,
Value = item.Id.ToString()
});
}
Run Code Online (Sandbox Code Playgroud)
麻烦的是,我需要为每个下拉列表重复该代码,因为对象具有代表该Text属性的不同字段SelectListItem
这是我想要完成的事情:
public static IEnumerable<SelectListItem> ToSelectListItem<T>(this IEnumerable<T> items, string key, string value, int SelectedId) {
// I really have no idea how to proceed from here :(
}
Run Code Online (Sandbox Code Playgroud)
bru*_*nde 20
好吧,你可以这样做:
public static IEnumerable<SelectListItem> ToSelectListItems(
this IEnumerable<T> items,
Func<T,string> nameSelector,
Func<T,string> valueSelector,
Func<T,bool> selected)
{
return items.OrderBy(item => nameSelector(item))
.Select(item =>
new SelectListItem
{
Selected = selected(item),
Text = nameSelector(item),
Value = valueSelector(item)
});
}
Run Code Online (Sandbox Code Playgroud)
您可以传入代理进行比较和属性检索.像这样的东西:
public static IEnumerable<SelectListItem> ToSelectListItem<T>(this IEnumerable<T> items,
int selectedId, Func<T,int> getId, Func<T, string> getName,
Func<T, string> getText, Func<T, string> getValue)
{
return
items.OrderBy(item => getName(item))
.Select(item =>
new SelectListItem
{
Selected = (getId(item) == selectedId),
Text = getText(item),
Value = getValue(item)
});
}
Run Code Online (Sandbox Code Playgroud)
然后你会像这样使用它:
var selected = specificObjects.ToSelectListItem(10, s => s.Id, s=> s.Name, s => s.Name, s => s.Id.ToString());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12782 次 |
| 最近记录: |