如何使用自动映射器将单个对象属性映射到复杂类型的对象数组 [英] How to map single object properties to array of object in complex type using automapper

查看:88
本文介绍了如何使用自动映射器将单个对象属性映射到复杂类型的对象数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到了如下的类结构,并且已经创建了映射结构,但是它没有按预期工作.

I got class structure like follows, and I've created mapping structure, but it is not working as expected.

public class ResponseHeader
{
    public ResHeader ResHeader { get; set; }  
}

public class ResHeader
{
    public ServiceResStatus ServiceResStatus { get; set; }

    public Error[] Errors { get; set; }
}

public class Error
{
    public string ErrorCode { get; set; }

    public string ErrorDesc { get; set; }

    public string Source { get; set; }
}

public class ServiceResStatus
{
    public string ServiceResCode { get; set; }

    public string ServiceResDesc { get; set; }

    public System.DateTime ServiceRespDateTime { get; set; }

    public string ServiceUniqueRefNo { get; set; }
}


public class ExceptionInformation
{
    public string Code { get; set; }
    public string Description { get; set; }
    public string Source { get; set; }  
}

我想将ExceptionInformation属性映射到ResponseHeader.我总是得到ResponseHeader dto为null.

I want to map ExceptionInformation properties to ResponseHeader. I always get ResponseHeader dto is null.

var config = new MapperConfiguration(cfg =>
        {

            cfg.CreateMap<ExceptionInformation, ResponseHeader>();


            cfg.CreateMap<ExceptionInformation, ResHeader>()
                .ForMember(d => d.Errors, opts => opts.ResolveUsing(src => new Error() {ErrorCode = src.Code}))
                .ForMember(d => d.Errors, opts => opts.ResolveUsing(src => new Error() {ErrorDesc = src.Description}))
                .ForMember(d => d.Errors, opts => opts.ResolveUsing(src => new Error() {Source = src.Code}))
                .ForMember(d => d.ServiceResStatus, opts => opts.Ignore());

            cfg.CreateMap<ExceptionInformation, ServiceResStatus>()
                .ForMember(d => d.ServiceResCode, opts => opts.MapFrom(src => src.Code))
                .ForMember(d => d.ServiceResDesc, opts => opts.MapFrom(src => src.Description))
                .ForMember(d => d.ServiceRespDateTime, opts => opts.MapFrom(src => DateTime.Now))
                .ForMember(d => d.ServiceUniqueRefNo, opts => opts.Ignore());

        });


        var mapper = config.CreateMapper();

        var info = new ExceptionInformation()
        {
            Code = "ERR01",
            Description = "Error",
            Source = "Oven"

        };


        ResponseHeader dto = mapper.Map<ResponseHeader>(info);

任何有效的解决方案表示赞赏.

any working solution appreciated.

推荐答案

我想出了此解决方案来解决您的问题.这是代码段

I came up with this solution to resolve your issue. Here is the code snippet

public class ResponseHeader
{
    public ResHeader ResHeader { get; set; }
}

public class ResHeader
{
    public ServiceResStatus ServiceResStatus { get; set; }

    public Error[] Errors { get; set; }
}

public class Error
{
    public string Code { get; set; }

    public string Description { get; set; }

    public string Source { get; set; }
}

public class ServiceResStatus
{
    public string ServiceResCode { get; set; }

    public string ServiceResDesc { get; set; }

    public System.DateTime ServiceRespDateTime { get; set; }

    public string ServiceUniqueRefNo { get; set; }
}


public class ExceptionInformation
{
    public string Code { get; set; }
    public string Description { get; set; }
    public string Source { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<ExceptionInformation, Error>();

            cfg.CreateMap<ExceptionInformation, ResHeader>()
                .ForMember(d => d.Errors, opts => opts.MapFrom(src => new[] {src}))
                .ForMember(d => d.ServiceResStatus, opts => opts.Ignore());

            cfg.CreateMap<ExceptionInformation, ServiceResStatus>()
                .ForMember(d => d.ServiceResCode, opts => opts.MapFrom(src => src.Code))
                .ForMember(d => d.ServiceResDesc, opts => opts.MapFrom(src => src.Description))
                .ForMember(d => d.ServiceRespDateTime, opts => opts.MapFrom(src => DateTime.Now))
                .ForMember(d => d.ServiceUniqueRefNo, opts => opts.Ignore());

            cfg.CreateMap<ExceptionInformation, ServiceResStatus>()
                .ForMember(d => d.ServiceResCode, opts => opts.MapFrom(src => src.Code))
                .ForMember(d => d.ServiceResDesc, opts => opts.MapFrom(src => src.Description))
                .ForMember(d => d.ServiceRespDateTime, opts => opts.MapFrom(src => DateTime.Now))
                .ForMember(d => d.ServiceUniqueRefNo, opts => opts.Ignore());

            cfg.CreateMap<ExceptionInformation, ResponseHeader>()
                .ForMember(des => des.ResHeader, opt => opt.MapFrom(src => new ResHeader()
                {
                    Errors = new Error[1] { new Error() {Code = src.Code, Description = src.Description, Source = src.Source }},
                    ServiceResStatus = new ServiceResStatus() { ServiceResCode = src.Code, ServiceResDesc = src.Description, ServiceRespDateTime = DateTime.Now, ServiceUniqueRefNo = null}
                }));
        });


        var mapper = config.CreateMapper();

        var info = new ExceptionInformation()
        {
            Code = "ERR01",
            Description = "Error",
            Source = "Oven"

        };

        var dto1 = mapper.Map<ExceptionInformation, Error>(info);
        var dto2 = mapper.Map<ExceptionInformation, ResHeader>(info);
        var dto3 = mapper.Map<ExceptionInformation, ServiceResStatus>(info); 
        var dto4 = mapper.Map<ExceptionInformation, ResponseHeader>(info);

        //Put a check point in cole readline and verify objects dto1, dto2, dto3 and dto4
        Console.ReadLine();
    }
}

}`

这篇关于如何使用自动映射器将单个对象属性映射到复杂类型的对象数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆