通用扩展方法重构

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));

公平警告。我从来没有使用过它,因为我发现生成的代码对于它在做什么并不明显。