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)
您可以为要用于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)
有两种选择:
如果可以在实体上实现接口
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
| 归档时间: |
|
| 查看次数: |
393 次 |
| 最近记录: |