我最近从 Automapper 4.2.1 升级到了 5.1.1,并且遇到了之前涉及开放泛型的有效映射的问题。
以前,在自动映射器配置中,我有以下打开的通用映射配置
CreateMap(typeof(IPager<>), typeof(ModelPager<>))
.ForMember("Items", e => e.MapFrom(o => (IEnumerable) o));
这在 Automapper 4 中有效,但在 5 中InvalidOperaionException
尝试通过IMapper.Map<TDestination>(source)
. 执行Items 操作的映射时似乎失败,并出现ForMember
异常消息“序列不包含匹配元素”
正如在下面的示例实现代码中所反映的
IPager<TSource>
implements IEnumerable<TSource>
,并且 的Items
属性ModelPager<TDestination>
是 anIEnumerable<TDestination>
所以强制转换应该是有效的。TSource
并且每个到都存在一个有效的映射TDestination
CreateMap<TSource, TDestination>();
IPager接口
public interface IPager<out TItem> : IEnumerable<TItem>
{
int CurrentPage { get; }
int PageCount { get; }
int PageSize { get; }
int TotalItems { get; }
}
IPager实现
public class Pager<TItem> : IPager<TItem>
{
private readonly IEnumerable<TItem> _items;
public Pager(IEnumerable<TItem> items,
int currentPage,
int pageSize,
int totalItems)
{
/// ... logic ...
this._items = items ?? Enumerable.Empty<TItem>();
this.CurrentPage = currentPage;
this.PageSize = pageSize;
this.TotalItems = totalItems;
}
public int CurrentPage { get; }
public int PageCount => (this.TotalItems + this.PageSize - 1) / this.PageSize;
public int PageSize { get; }
public int TotalItems { get; }
IEnumerator IEnumerable.GetEnumerator() => this.GetEnumerator();
public IEnumerator<TItem> GetEnumerator() => this._items.GetEnumerator();
}
模型寻呼机
public class ModelPager<TItem>
{
public int CurrentPage { get; set; }
public IEnumerable<TItem> Items { get; set; }
public int PageCount { get; set; }
public int PageSize { get; set; }
public int TotalItems { get; set; }
}
什么是在 Automapper 5 中映射它的正确方法,而不是通过显式映射每个可能的映射来放弃开放泛型,或者通过使用需要我手动映射所有属性并使用反射来解析开放类型的自定义开放泛型类型转换器任务?