通用ToSelectListItem方法

kir*_*era 2 c# linq generics asp.net-mvc

我在数据库中有大约10个非常简单的表:

create table EmploymentStatus
(
    Id int identity(1,1) Primary Key,
    Name nvarchar(100) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

这些表用于DropDownLists注册视图,如下所示:

@Html.DropDownListFor(m => m.EmploymentStatus, Model.EmploymentStatusList, Resource.EmploymentStatus, new { @class = "form form-control" })
Run Code Online (Sandbox Code Playgroud)

DropDownListFor需要IEnumerable<SelectListItem> selectList一个集合.所以,我创建了一个方法:

public static List<SelectListItem> ToSelectItemList(IQueryable<EmploymentStatu> statuses)
{
    return statuses.Select(m => new SelectListItem
    {
        Text = m.Name,
        Value = m.Id.ToString()
    }).ToList();
}
Run Code Online (Sandbox Code Playgroud)

问题是我必须为十个实体中的每一个创建一个方法.是否有一种编写通用方法的好方法,如下所示:

public static List<SelectListItem> ToSelectItemList(IQueryable<T> collection)
{
    return collection.Select(m => new SelectListItem
    {
        Text = m.Name,
        Value = m.Id.ToString()
    }).ToList();
}
Run Code Online (Sandbox Code Playgroud)

Rom*_*syk 8

您可以为要用于DropDownLists的所有实体定义接口

public interface IDropDownItem
{
   int Id {get; set;}
   string Name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

然后

public static List<SelectListItem> ToSelectItemList<T>(IEnumerable<T> collection) 
   where T : IDropDownItem
{
    return collection.Select(m => new SelectListItem
    {
        Text = m.Name,
        Value = m.Id.ToString()
    }).ToList();
}
Run Code Online (Sandbox Code Playgroud)

ToSelectItemList扩展方法会更好:

public static class EnumerableExtensions
{
    public static List<SelectListItem> ToSelectItemList<T>(this IEnumerable<T> collection)
        where T : Program
    {
        return collection.Select(m => new SelectListItem
        {
            Text = m.Name,
            Value = m.Id.ToString()
        }).ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)


Tit*_*mir 5

有两种选择:

如果可以在实体上实现接口

public interface ISelectable
{
    string Name { get; }
    int Id { get; }
}
public static List<SelectListItem> ToSelectItemList<T>(this IEnumerable<T> collection)
    where T: ISelectable
{
    return collection.Select(m => new SelectListItem
    {
        Text = m.Name,
        Value = m.Id.ToString()
    }).ToList();
}
Run Code Online (Sandbox Code Playgroud)

使用代表

public static List<SelectListItem> ToSelectItemList<T>(this IEnumerable<T> collection, Func<T, string> nameGetter, Func<T, int> idGetter)
{
    return collection.Select(m => new SelectListItem
    {
        Text = nameGetter(m),
        Value = idGetter(m).ToString()
    }).ToList();
}
Run Code Online (Sandbox Code Playgroud)

用法:

m.EmploymentStatus.ToSelectItemList(e => e.Name, e => e.Id);
Run Code Online (Sandbox Code Playgroud)

第二个选项使用起来比较冗长,但是您可以获得更大的灵活性,因为您不必使用无用的接口实现来混淆数据模型,并且您可以自由地使用任何属性名称Name或者Id