Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq SelectList扩展-耦合表达式_Linq_Lambda - Fatal编程技术网

Linq SelectList扩展-耦合表达式

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

所以我有一个疯狂的想法,我可以做一些很酷的工作。我厌倦了新的selectlistitem,诸如此类,所以我开始编写一个扩展方法,试图让它更具有强类型,比如这样

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