如何使用AutoMapper从强类型列表映射到类型为object的数组列表



我需要将DTO对象映射到我的Web服务将接受的对象。

DTO对象:

public class TerminationCause
{
    // other properties...
    public List<TerminationCauseServicePurchase> TerminationCauseServicePurchase { get; set; }
    public TerminationCause()
    {
        TerminationCauseServicePurchase = new List<TerminationCauseServicePurchase>();
    }
}

Web服务对象:

public partial class TerminationCause
{
    public object[] TerminationCauseServicePurchase { get; set; }
    // other properties...
}

所有"其他属性"都具有相同的名称,TerminationCauseServicePurchase类也相同。问题是没有映射字段TerminationCauseServicePurchase。

以下是映射:

Mapper.CreateMap<DTO.TerminationCause, ExternalUdbudsportal.TerminationCause>();
Mapper.CreateMap<DTO.TerminationCauseServicePurchase, ExternalUdbudsportal.TerminationCauseServicePurchase>();

TerminationCause对象得到了正确映射,但其内部列表"TerminationCauseServicePurchase"仍然是web服务不接受的相同类型(DTO.TerminationCouseServicePurPurchase而不是ExternalUdbudsportal.TerminationCauseServicePurchasy)。

地图方法:

upEkst.TerminationCause tmpTC = Mapper.Map<DTO.TerminationCause, upEkst.TerminationCause>(tc);

我的解决方案:

由于AutoMapper不会自动映射内部object[]数组,因此我从DTOTerminationCause对象中取出List<TerminationCauseServicePurchase>,并使用AutoMapper显式映射它。

upEkst.TerminationCause tmpTC = Mapper.Map<DTO.TerminationCause, upEkst.TerminationCause>(tc);
var tmpTCSPList = Mapper.Map<List<DTO.TerminationCauseServicePurchase>,
upEkst.TerminationCauseServicePurchase[]>(tc.TerminationCauseServicePurchase);
tmpTC.TerminationCauseServicePurchase = tmpTCSPList;

您可以使用最新的Automapper创建一个自定义函数来实现这一点。它使用CreateMissingTypeMaps属性。

public static T[] MapDynamicList<T>(IEnumerable<YOUR_CUSTOM_CLASS> obj)
    {
        var config = new MapperConfiguration(c => c.CreateMissingTypeMaps = true);
        var mapper = config.CreateMapper();
        var newModel = obj.Select(mapper.Map<T>).ToArray();
        return newModel;
    }

然后你只需要用这一行代码调用函数:

var viewModel = Models.Helper.MapDynamicList<object>(model);

其中CCD_ 4是IEnumerable或List。

最新更新