我需要一种方法来创建一个IEnumerable的扩展方法,这将允许我返回一个SelectListItem的列表。
例如
public class Role
{
public string Name {get;set;}
public string RoleUID {get;set;}
}
IEnumerable<Role> Roles = .../*Get Roles From Database*/
var selectItemList = Roles.ToSelectItemList(p => p.RoleUID,r => r.Name);
这会给我一个SelectItemList,其中Name是显示,RoleUID是值。
重要我希望这是通用的,所以我可以用对象的任何两个属性创建它,而不仅仅是Role类型的对象。
我该怎么做?
我想象下面的内容
public static List<SelectItemList> ToSelectItemList<T,V,K>(this IEnumerable<T>,Func<T,V,K> k)
或其他什么,我显然知道这是不正确的。
答案 0 :(得分:9)
为什么不结合现有的Select
和ToList
方法?
var selectItemList = Roles
.Select(p => new SelectListItem { Value = p.RoleUID, Text = p.Name })
.ToList();
如果您想将其专门放入一个方法中,那么您可以将ToSelectListItem
定义为这两种方法的组合。
public static List<SelectListItem> ToSelectListItem<T>(
this IEnumerable<T> enumerable,
Func<T, string> getText,
Func<T, string> getValue) {
return enumerable
.Select(x => new SelectListItem { Text = getText(x), Value = getValue(x) })
.ToList();
}
答案 1 :(得分:1)
这样的事情怎么样? (注意:我没有对此进行测试,但它应该有效。
public static List<SelectListItem> ToSelectItemList<T>(this IEnumerable<T> source, Func<T, string> textPropertySelector, Func<T, string> valuePropertySelector, Func<T, bool> isSelectedSelector)
{
return source
.Select(obj => new SelectListItem
{
Text = textPropertySelector(obj),
Value = valuePropertySelector(obj),
Selected = isSelectedSelector(obj)
})
.ToList();
}
你会像现在一样使用它,唯一的区别是我添加了另一个选择器来设置Selected
布尔属性。
答案 2 :(得分:0)
如何使用这样的东西
IEnumerable<SelectListItem> data = Roles.Select(f => new SelectListItem { Value = f.RoleUID, Text = f.Name});
对我有用!