Automapper 映射复杂的嵌套对象
Automapper Mapping Complex nested Objects
我目前在尝试映射数据对象时遇到错误,如下所示;
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; }
数据Class
public string Client { get; set; }
public IList<Extensions> Extensions { get; set; }
扩展源 Class
public Decimal Limit { get; set; }
public Decimal Rate { get; set; }
我的目的地Class; QuoteDestinationModel
public string ResponseStatus { get; set; }
public IList<DataModel> Data { get; set; }
DataModel
public string Client { get; set; }
public IList<ExtensionsModel> Extensions { get; set; }
ExtensionModel Class
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
时,它 returns 没有错误,也没有结果只是一个空列表,而当我使用 IList
时,它 returns 出现上述错误。我想要做的就是将结果映射到 QuoteDestinationModel。
编辑
我正在使用 Automapper 9.0.0 版
AutoMapper 文档指出:
"AutoMapper only requires configuration of element types, not of any array or list type that might be used. " ~ 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<T>
ICollection
ICollection<T>
IList
IList<T>
List<T>
Array
请注意,我删除了告诉 AutoMapper 如何在 Data
成员之间进行映射的配置部分。由于源模型和目标模型具有相同的名称,即 Data
,AutoMapper 将很好地映射它们,而无需明确告诉它如何做。也就是说,如果您之前在配置中创建 Data
和 DataModel
类型之间的映射。
我目前在尝试映射数据对象时遇到错误,如下所示;
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; }
数据Class
public string Client { get; set; }
public IList<Extensions> Extensions { get; set; }
扩展源 Class
public Decimal Limit { get; set; }
public Decimal Rate { get; set; }
我的目的地Class; QuoteDestinationModel
public string ResponseStatus { get; set; }
public IList<DataModel> Data { get; set; }
DataModel
public string Client { get; set; }
public IList<ExtensionsModel> Extensions { get; set; }
ExtensionModel Class
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
时,它 returns 没有错误,也没有结果只是一个空列表,而当我使用 IList
时,它 returns 出现上述错误。我想要做的就是将结果映射到 QuoteDestinationModel。
编辑 我正在使用 Automapper 9.0.0 版
AutoMapper 文档指出:
"AutoMapper only requires configuration of element types, not of any array or list type that might be used. " ~ 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<T>
ICollection
ICollection<T>
IList
IList<T>
List<T>
Array
请注意,我删除了告诉 AutoMapper 如何在 Data
成员之间进行映射的配置部分。由于源模型和目标模型具有相同的名称,即 Data
,AutoMapper 将很好地映射它们,而无需明确告诉它如何做。也就是说,如果您之前在配置中创建 Data
和 DataModel
类型之间的映射。