Linq SelectList扩展-耦合表达式
所以我有一个疯狂的想法,我可以做一些很酷的工作。我厌倦了新的selectlistitem,诸如此类,所以我开始编写一个扩展方法,试图让它更具有强类型,比如这样Linq SelectList扩展-耦合表达式,linq,lambda,Linq,Lambda,所以我有一个疯狂的想法,我可以做一些很酷的工作。我厌倦了新的selectlistitem,诸如此类,所以我开始编写一个扩展方法,试图让它更具有强类型,比如这样 var selectList = projects.ToSelectList(p =>p.ProjectID, p =>p.ProjectName); 扩展方法有点像这样 public static SelectList ToSelectList<T>(this IEnumerable<T> item
var selectList = projects.ToSelectList(p =>p.ProjectID, p =>p.ProjectName);
扩展方法有点像这样
public static SelectList ToSelectList<T>(this IEnumerable<T> item,
Expression<Func<T, string>> textName,
Expression<Func<T, string>> valueProperty)
{
//do cool stuff
return new SelectList(items, dataTextField, dataValueField);
}
我需要了解的是反射属性,这样我就可以获取值和名称。有什么办法可以做到吗?有没有想过要做得更好/更容易?我以前做过这件事,但我不记得我是怎么做的
编辑这个需要一些澄清。我复制了一些正在运行且未经过优化的代码,因此我更新了这些代码以反映更正确的标准。我不明白为什么必须使用反射来完成此操作
public static SelectList ToSelectListItem<T>(this IEnumerable<T> items,
Func<T, string> textName, Func<T, string> valueProperty) {
{
return new SelectList(items
.Select(i => new SelectListItem {Text = textName(i), Value = valueProperty(i)}));
}
}
应该可以工作,但我在当前计算机上没有MVC dll。我最初在开始使用MVC时也尝试过你的想法,但后来我意识到我想以某种方式格式化某些字段,以及默认情况下应该选择某个项的时间。在处理了所有这些之后,我意识到只写一行LAMDA表达式会更清晰 所以现在我通常只做一个LAMDA表达式来生成SelectListItem集合
<b>Screener: </b><%= Html.DropDownList("ScreenerOI", Model.Screeners.Select(p=>new SelectListItem() { Text = p.firstName + " " + p.lastName, Value = p.OI.ToString() })) %>
<b>Open Time: </b>
<%= Html.DropDownListFor(c => c.OpenTime, Model.HoursInDay.Select(p => new SelectListItem() { Text = p != null ? DateTime.Now.Date.Add(p.Value).ToString("h:mm tt") : "Clear Time", Value = p != null ? p.ToString() : "", Selected = Model.OpenTime == p }).ToList())%>
这似乎和你的想法一样清楚
另一个例子
<b>Screener Status: </b>
<%= Html.DropDownListFor(c => c.InfoStatusOI, Model.InfoStatuses.Select(p => new SelectListItem() { Text = p != null ? p.Status.ToString() : "", Value = p != null ? p.OI.ToString() : "", Selected = p != null && Model.InfoStatusOI == p.OI }).ToList())%>
这需要清理和测试的东西,如零计数的项目,但这里的最终结果
public static SelectList ToSelectList<T>(this IEnumerable<T> items, Expression<Func<T, object >> textName, Expression<Func<T, object >> valueProperty)
{
var dataTextField = textName.Body.ToString().Split('.')[1];
var dataValueField = valueProperty.Body.ToString().Split('.')[1];
return new SelectList(items, dataTextField, dataValueField);
}