objects example custom collection c# collections ienumerable automapper automapper-2

c# - example - automapper nested collection



¿Es este un cambio de ruptura entre AutoMapper 2.0.0 y 2.2.0? (2)

¿Ha intentado usar el método Map de esa manera: Mapper.Map<DestinationClass, SourceClass>(object to convert)

?

Con la versión 2.2 de AutoMapper, así es como lo usamos y funciona bien para nosotros.

Actualicé de AutoMapper 2.0.0 a 2.2.0 hoy y me di cuenta de que la actualización rompió algunos códigos. Quería preguntar sobre esto aquí antes de publicarlo como un problema en el sitio Github de automapper.

Uno de mis tipos de destino inicializa una propiedad de colección así:

public class PageOf<TModel> { public PageOf() { Items = Enumerable.Empty<TModel>(); } public IEnumerable<TModel> Items { get; set; } }

Con automapper 2.0.0, esto estaba bien. Cuando actualicé a la versión 2.2.0, la asignación a este tipo de destino provocó una excepción NotSupportedException con el mensaje "La colección tenía un tamaño fijo". (Esa excepción estaba dentro de una excepción AutoMapperMappingException).

Pude solucionar el problema cambiando el código del constructor anterior a esto:

public PageOf() { Items = new List<TModel>(); }

Parece que AutoMapper 2.0.0 estaba descartando cualquier valor que estuviera en la propiedad Items y utilizando el set accesores de propiedades, mientras que AutoMapper 2.2.0 solo está usando el descriptor de acceso de propiedades de get e intentando modificar el IEnumerable existente. Parece que Enumerable.Empty<TModel>() simplemente está sustituyendo una matriz de longitud cero, lo que explicaría la excepción.

¿Es esto un error? ¿Qué cambió en AutoMapper entre 2.0.0 y 2.2.0 que haría que ignorara el establecedor de propiedades de destino y en su lugar intentara modificar la colección existente?

Actualizar:

Según lo solicitado, aquí está la llamada a CreateMap:

public class PagedQueryResultToPageOfItemsProfiler : Profile { protected override void Configure() { CreateMap<PagedQueryResult<EstablishmentView>, PageOfEstablishmentApiModel>(); } }

La clase PageOfEstablishmentApiModel hereda de PageOf<EstablishmentApiModel> .

Aquí está el código de Mapper.Map:

var query = Mapper.Map<EstablishmentViewsByKeyword>(input); var results = _queryProcessor.Execute(query); var model = Mapper.Map<PageOfEstablishmentApiModel>(results); // exception here

Si es necesaria una configuración de mapeo especial (por ejemplo .ConvertUsing (x => x)) en AutoMapper desde 2.0.0 a 2.2.0, es posible que tengamos que aferrarnos a la versión anterior. Siempre me gustó cómo AM convertía automáticamente las propiedades de colección, y sin eso, AM se parece más a ValueInjecter.


Supongo que está intentando agregar a su colección, pero como su colección es una instancia de solo lectura ( Enumerable.Empty<T> ), en realidad no puede modificarla. Supongo que está en lo correcto al decir que AutoMapper cambió el código en torno a la forma en que instancian el nuevo tipo. Utilice una instancia mutable en su lugar, como la new List<T>() o T[] .