这是AutoMapper 2.0.0和2.2.0之间的重大变化吗?

dan*_*wig 32 c# collections ienumerable automapper automapper-2

我今天从AutoMapper 2.0.0更新到2.2.0,并意识到更新破坏了一些代码.想要在automapper github网站上发布问题之前在这里问一下这个问题.

我的一个目标类型初始化一个集合属性,如下所示:

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

    public IEnumerable<TModel> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

使用automapper 2.0.0,这很好.当我更新到2.2.0时,映射到此目标类型会导致NotSupportedException,并显示消息"Collection is a fixed size".(该异常包含在AutoMapperMappingException中.)

我能够通过将上面的构造函数代码更改为此来解决此问题:

public PageOf()
{
    Items = new List<TModel>();
}
Run Code Online (Sandbox Code Playgroud)

似乎AutoMapper 2.0.0正在丢弃Items属性中的任何值并使用setProperty访问器,而AutoMapper 2.2.0只是使用get属性访问器并尝试修改现有的IEnumerable.它看起来Enumerable.Empty<TModel>()只是替换一个零长度数组,这将解释异常.

这是一个错误吗?AutoMapper在2.0.0和2.2.0之间的变化会导致它忽略目标属性设置器,而是尝试修改现有的集合?

更新:

根据要求,这是CreateMap调用:

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

PageOfEstablishmentApiModel类从继承PageOf<EstablishmentApiModel>.

这是Mapper.Map代码:

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

如果在AutoMapper中从2.0.0到2.2.0 需要特殊的映射配置(例如.ConvertUsing(x => x)),我们可能需要挂起旧版本.我总是喜欢AM如何自动转换集合属性,没有它,AM看起来更像是ValueInjecter.

Nic*_*ier 1

您是否尝试过这样使用 Map 方法: Mapper.Map<DestinationClass, SourceClass>(object to convert)

对于 2.2 版本的 AutoMapper,这就是我们使用它的方式,它对我们来说工作得很好。

  • 是的,如果您阅读问题中的代码,那就是我正在做的事情。 (2认同)