C# 通用扩展方法重构

C# 通用扩展方法重构,c#,generics,extension-methods,C#,Generics,Extension Methods,我想知道是否可以按照我希望的方式重构以下内容: [EditorBrowsable(EditorBrowsableState.Never)] public static class ListExtensions { public static PaginatedList<Y> ToMappedPaginatedList<T, Y>(this PaginatedList<T> source) { var mappedList = n

我想知道是否可以按照我希望的方式重构以下内容:

[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);
    }
}
[EditorBrowsable(EditorBrowsableState.Never)]
公共静态类ListExtensions
{
公共静态分页列表到AppedPaginatedList(此分页列表源)
{
var mappedList=新列表();
Mapper.Map(源,mappedList);
返回新的分页列表(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>();
var result1 = s.ToMappedPaginatedList(default(FarmerDTO));
var list=wait\u service.GetAllAsync(pageIndex,\u pageSize);
var dtoList=list.ToMappedPaginatedList();
但我想这样称呼它:

var list = await _service.GetAllAsync(pageIndex, _pageSize);
var dtoList = list.ToMappedPaginatedList<Farmer, FarmerDTO>();
var dtoList = list.ToMappedPaginatedList<FarmerDTO>();
var result1 = s.ToMappedPaginatedList(default(FarmerDTO));
var dtoList=list.ToMappedPaginatedList();
这节省了一点输入,您不必总是知道源列表及其类型。不幸的是,这段代码不起作用,我不确定是否有一个简单的答案

有人有主意吗

提前谢谢


Yannick

要么调用一个方法并指定所有泛型参数,要么不指定任何泛型参数并让编译器进行推断,不支持部分推断


因此,让代码编译的唯一方法是让
ToMappedPaginatedList
接受一个泛型参数,而不是两个。

如果您有权访问PaginatedList类,将该方法放入其中将启用所需的语法,因为实例知道它自己的类型

我不推荐以下内容,但它演示了一种利用类型推断的方法

您可以通过添加第二个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);
    }
}

公平的警告。我从未使用过这个,因为我发现生成的代码对于它所做的事情并不明显。

Mapper.Map需要知道
源代码的类型吗?它是如何定义的?一般来说,我也不喜欢它,但事实上,它相当聪明,而且在某些情况下它是值得的+1.