通用扩展方法重构

时间:2015-04-16 12:29:17

标签: c# generics extension-methods

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

[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

2 个答案:

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

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