我想知道是否可以按照我希望的方式重构以下内容:
[EditorBrowsable(EditorBrowsableState.Never)]
public static class ListExtensions
{
public static PaginatedList<Y> ToMappedPaginatedList<T, Y>(this PaginatedList<T> source)
{
var mappedList = new List<Y>();
Mapper.Map(source, mappedList);
return new PaginatedList<Y>(mappedList, source.PageIndex, source.PageSize, source.TotalCount);
}
}
Mapper.Map行使用AutoMapper将属性从实体映射到DTO对象。
这就是这样的:
var list = await _service.GetAllAsync(pageIndex, _pageSize);
var dtoList = list.ToMappedPaginatedList<Farmer, FarmerDTO>();
但我想称之为:
var dtoList = list.ToMappedPaginatedList<FarmerDTO>();
这节省了一点点输入,并不总是需要知道源类型的类型。不幸的是,这段代码不起作用,我不确定是否有一个简单的答案。
有人有个主意吗?
提前致谢。
的Yannick
答案 0 :(得分:1)
要么调用方法并指定所有泛型参数,要么指定none,让编译器推断它们,不支持部分推理。
因此,让代码编译的唯一方法是使ToMappedPaginatedList
取一个通用参数,而不是两个。
答案 1 :(得分:1)
如果您可以访问PaginatedList类,那么将该方法放在那里将启用您想要的语法,因为实例知道它自己的类型是什么。
我不推荐以下内容,但它展示了一种利用类型推断的方法。
您可以通过添加第二个&#34;无用的&#34;来启用类型推断。 Y型参数。
如果将default(FarmerDTO)
作为第二个参数传递,则将传递null作为参数值,但将推断出预期的类型。
[EditorBrowsable(EditorBrowsableState.Never)]
public static class ListExtensions
{
public static PaginatedList<Y> ToMappedPaginatedList<T, Y>(this PaginatedList<T> source, Y destinationPlaceholder)
{
var mappedList = new List<Y>();
Mapper.Map(source, mappedList);
return new PaginatedList<Y>(mappedList, source.PageIndex, source.PageSize, source.TotalCount);
}
}
这样称呼:
var result1 = s.ToMappedPaginatedList(default(FarmerDTO));
公平警告。我从未使用过这个,因为我发现生成的代码对于它正在做什么并不明显。