Недавно я обновился от Automapper 4.2.1 до 5.1.1, и у меня возникли проблемы с ранее действительным сопоставлением с открытыми дженериками.Автоматизация с использованием открытых генериков и включение источника в оператор ForMember
Ранее в конфигурации automapper, я имел следующую открытую общую конфигурацию отображения
CreateMap(typeof(IPager<>), typeof(ModelPager<>))
.ForMember("Items", e => e.MapFrom(o => (IEnumerable) o));
Это работает в Automapper 4, но не в 5 с InvalidOperaionException
при попытке отобразить с помощью IMapper.Map<TDestination>(source)
. Это, как представляется, сбой при выполнении картирования ЭлементовForMember
операции с сообщением исключения из «последовательности не содержит соответствующий элемента»
Как отражена в коде примеров реализации ниже IPager<TSource>
реализуют IEnumerable<TSource>
, и Items
собственности ModelPager<TDestination>
- IEnumerable<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();
}
ModelPager
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 либо без отказа от open generics явным образом отображения каждого возможного отображения, или с помощью пользовательских открытой родовой type converter, что мне бы потребовалось, чтобы вручную отобразить все свойства и использовать отражение для разрешить открытые типы для назначения?
Это выглядит как ошибка, вы можете открыть вопрос GitHub? –
@JimmyBogard может сделать – rheone
Проблема [# 1624] (https://github.com/AutoMapper/AutoMapper/issues/1624) была отправлена – rheone