4

我想知道我如何能够创建一个可重用的方法来创建基于方法参数的选择列表?我在想像下面这样的事情:

public IEnumerable<SelectListItem> CreateSelectList(IList<T> entities, T value, T text)
{

   return  entities
           .Select(x => new SelectListItem
                           {
                               Value = x.value.ToString(),
                               Text = x.text.ToString()
                           });
}

我觉得我有点倒退了。我不确定如何调用这样的方法,当我使用类别的 IList 作为第一个参数调用它时,编译器抱怨它不能将类别类型分配给类型 T?另外,我如何将方法参数插入到 lambda 中?任何帮助表示赞赏!

我试图用来调用它的代码(这是错误的,但你明白了)

viewModel.Categories = _formServices.CreateSelectList(categories, Id, Name);

我试图使代码更通用和可重用的代码:

viewModel.Categories = categories
                      .Select(x => new SelectListItem
                     {
                         Value = x.Id.ToString(),
                         Text = x.Name
                      });

编辑答案

归功于@Pavel Backshy 的工作答案。我想编辑我对他的回答所做的扩展,以防它帮助任何人!该扩展只是在组合中添加了一个 .Where 子句:

    public IEnumerable<SelectListItem> CreateSelectListWhere<T>(IList<T> entities, Func<T, bool> whereClause, Func<T, object> funcToGetValue, Func<T, object> funcToGetText)
    {
        return entities
               .Where(whereClause)
               .Select(x => new SelectListItem
                {
                    Value = funcToGetValue(x).ToString(),
                    Text = funcToGetText(x).ToString()
                });
    }
4

2 回答 2

8

您可以使用反射来定义它以按名称获取属性值,但我认为使用 Func 更加优雅和灵活。将您的方法更改为:

public IEnumerable<SelectListItem> CreateSelectList<T>(IList<T> entities, Func<T, object> funcToGetValue, Func<T, object> funcToGetText)
{
    return entities
            .Select(x => new SelectListItem
            {
                Value = funcToGetValue(x).ToString(),
                Text = funcToGetText(x).ToString()
            });
}

然后你可以通过这种方式使用它:

viewModel.Categories = _formServices.CreateSelectList(categories, x => x.Id, x => x.Name);
于 2012-08-19T13:03:14.053 回答
1

我发现 Pavel Bakshy 的回答以及您对包含“whereClause”的编辑非常有帮助,这正是我想要完成的。同样,我还添加了一个“selectedValue”对象,因为这是我尝试做的一部分。'null' 检查适用于列表没有当前选定值的情况(即首次加载时)。

编辑:我也使用 IEnumerable 而不是 IList 作为我的第一个参数

    IEnumerable<SelectListItem> ISelectUtils.CreateSelectList<T>(IEnumerable<T> entities, Func<T, bool> whereClause, Func<T, object> funcToGetValue, Func<T, object> funcToGetText, object selectedValue)
    {
        return entities
                .Where(whereClause)
                .Select(x => new SelectListItem
                {
                    Value = funcToGetValue(x).ToString(),
                    Text = funcToGetText(x).ToString(),
                    Selected =  selectedValue != null ? ((funcToGetValue(x).ToString() == selectedValue.ToString()) ? true : false) : false
                });
    }
于 2017-02-06T14:33:09.337 回答