Это попытка сопоставить string
в ExpandoObject
с IAddress
в вашем типе цели. Очевидно, что он не может создать экземпляр IAddress
для заполнения, поэтому вы должны выполнить это самостоятельно в отображении.
Если ваши модели выглядят так:
public class TargetModel
{
public int Id { get; set; }
public IAddress AbstractAddress { get; set; }
}
public interface IAddress
{
string Address01 { get; set; }
}
public class Address : IAddress
{
public string Address01 { get; set; }
}
Тогда ваши настройки и настройки могут выглядеть следующим образом:
public void MappingTests()
{
dynamic sourceModel = new ExpandoObject();
// flat model - id should map to TargetModel, Address01 will map to a nested type Address on TargetModel
sourceModel.Id = 1;
sourceModel.Address01 = "address01";
Mapper.Initialize(cfg =>
{
cfg.CreateMap<ExpandoObject, TargetModel>()
.ForMember(dest => dest.AbstractAddress, opt => opt.MapFrom(src => new Address() { Address01 = src.First(kvp => kvp.Key == "Address01").Value.ToString() }))
.ForMember(destinationMember => destinationMember.Id, opt => opt.MapFrom(src => src.First(kvp => kvp.Key == "Id").Value));
});
TargetModel target = Mapper.Map<TargetModel>(sourceModel);
}
Я просто использовал его как IEnumerable<KeyValuePair<string, object>>
, но вы также можете трактовать объект растяжения как словарь путем приведения.
cfg.CreateMap<ExpandoObject, TargetModel>()
.ForMember(dest => dest.AbstractAddress, opt => opt.MapFrom(src => new Address() { Address01 = ((IDictionary<string, object>)src)["Address01"].ToString() }))
.ForMember(destinationMember => destinationMember.Id, opt => opt.MapFrom(src => ((IDictionary<string, object>)src)["Id"]));