【问题标题】:Automapper Mapping Complex nested ObjectsAutomapper 映射复杂的嵌套对象
【发布时间】:2020-04-03 08:54:41
【问题描述】:

我目前在尝试映射数据对象时遇到错误,如下所示;

Method 'get_Item' in type 'Proxy_System.Collections.Generic.IList`1[[InsureAfrika_API.Model.DataModel, InsureAfrika API, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]_28141317_' from assembly 'AutoMapper.Proxies, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005' does not have an implementation.

以下是我的数据源; QuoteSourceDto

public string ResponseStatus { get; set; }
public IList<Data> Data { get; set; }

数据类

public string Client { get; set; }
public IList<Extensions> Extensions { get; set; }

扩展源类

public Decimal Limit { get; set; }
public Decimal Rate { get; set; }

我的目的地班; QuoteDestinationModel

public string ResponseStatus { get; set; }
public IList<DataModel> Data { get; set; }

数据模型

public string Client { get; set; }
public IList<ExtensionsModel> Extensions { get; set; }

ExtensionModel 类

public Decimal Limit { get; set; }
public Decimal Rate { get; set; }

以下是我的映射器配置;

var config = new MapperConfiguration(cfg => {
   cfg.CreateMap<IList<Extensions>, IList<ExtensionsModel>>();
   cfg.CreateMap<IList<Data>, IList<DataModel>>();

   cfg.CreateMap<QuoteSourceDto, QuoteDestinationModel>()
                    .ForMember(dest => dest.Data, opt => opt.MapFrom(src => src.Data))
                    .ForMember(dest => dest.ResponseStatus, opt => opt.Ignore());
})

我的数据源;

IList<Extensions> exts =new List<Extensions>
{
   new Extensions{Rate=1.34M,Limit=21400.00M};
}

IList<Data> dat = new List<Data>
{
  new Data{Client="Micael Angelus", Extensions =exts};
};

QuoteSourceDto dtos = new QuoteSourceDto
{
     ResponseStatus = "Success",
     Data = dat
};

因此我的 Map 函数调用如下所示;


var _client = mapper.Map<QuoteSourceDto, QuoteDestinationModel>(dtos);

当我使用List 类型时,它不会返回任何错误,也不会返回一个空列表,而当我使用IList 时,它会返回上述错误。我要做的就是将结果映射到 QuoteDestinationModel。

编辑 我正在使用 Automapper 版本 9.0.0

【问题讨论】:

标签: c# automapper


【解决方案1】:

AutoMapper 文档说明:

“AutoMapper 只需要配置元素类型,而不需要任何可能使用的数组或列表类型。” ~ Documentation

这意味着您不必(也不应该)在特定类型的集合(使用泛型类型参数)之间创建映射配置文件,就像您所做的那样:

// Don't do that!
cfg.CreateMap<IList<Extensions>, IList<ExtensionsModel>>();

相反,创建具体类型之间的映射配置文件:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<Extensions, ExtensionsModel>();
    cfg.CreateMap<Data, DataModel>();
    cfg.CreateMap<QuoteSourceDto, QuoteDestinationModel>()
        .ForMember(dest => dest.ResponseStatus, opt => opt.Ignore());
});

AutoMapper 将为您创建一个集合。支持的源集合类型:

  • IEnumerable
  • IEnumerable&lt;T&gt;
  • ICollection
  • ICollection&lt;T&gt;
  • IList
  • IList&lt;T&gt;
  • List&lt;T&gt;
  • Array

请注意,我删除了告诉 AutoMapper 如何在 Data 成员之间映射的配置部分。由于 - 源和目标 - 模型具有相同的名称,即 Data,AutoMapper 将很好地映射它们,而无需明确告诉它如何做到这一点。也就是说,如果您之前在配置中创建了 DataDataModel 类型之间的映射。

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多