SelectList扩展 - 耦合表达式

时间:2010-08-19 20:08:04

标签: linq lambda

所以我有了这个疯狂的想法,我可以做一些很酷的工作。我厌倦了新的选择列表(项目,“blah”,“blahblah”),所以我开始编写一个扩展方法(尝试更强类型)这样的事情......

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);
    }

我需要获得的是反射属性,因此我可以获取值并获取名称。我有什么想法可以做到吗?这样做的想法更好/更容易吗?我以前做过这个,但对于我的生活,我不记得我是怎么做到的。

修改这需要一些澄清。我复制了一些在飞行中但未经过改进的代码,因此我更新了该代码以反映更正确的标准。

3 个答案:

答案 0 :(得分:5)

我不明白为什么你必须使用Reflection来做这件事。

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。

答案 1 :(得分:0)

当我开始使用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())%>

答案 2 :(得分:0)

这需要清理和测试物品的零数量,但这是最终结果。

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);
        }