通用扩展方法重构
Generic extension method refactor
我想知道是否可以按照我想要的方式重构以下内容:
[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>();
这样可以节省一些输入,而且您不必总是知道源列表的类型。不幸的是这段代码不起作用,我不确定是否有一个简单的答案。
有人知道吗?
提前致谢。
雅尼克
要么调用一个方法并指定所有泛型参数,要么指定 none 并让编译器推断它们,不支持部分推断。
因此,编译代码的唯一方法是使 ToMappedPaginatedList
采用 1 个通用参数,而不是两个。
如果您有权访问 PaginatedList class,将方法放在那里将启用您想要的语法,因为实例知道它自己的类型是什么。
我不推荐以下内容,但它展示了一种利用类型推断的方法。
您可以通过添加 Y 类型的第二个 "useless" 参数来启用类型推断。
如果将 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));
公平警告。我从来没有使用过它,因为我发现生成的代码对于它在做什么并不明显。
我想知道是否可以按照我想要的方式重构以下内容:
[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>();
这样可以节省一些输入,而且您不必总是知道源列表的类型。不幸的是这段代码不起作用,我不确定是否有一个简单的答案。
有人知道吗?
提前致谢。
雅尼克
要么调用一个方法并指定所有泛型参数,要么指定 none 并让编译器推断它们,不支持部分推断。
因此,编译代码的唯一方法是使 ToMappedPaginatedList
采用 1 个通用参数,而不是两个。
如果您有权访问 PaginatedList class,将方法放在那里将启用您想要的语法,因为实例知道它自己的类型是什么。
我不推荐以下内容,但它展示了一种利用类型推断的方法。
您可以通过添加 Y 类型的第二个 "useless" 参数来启用类型推断。
如果将 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));
公平警告。我从来没有使用过它,因为我发现生成的代码对于它在做什么并不明显。