繁体   English   中英

如何使用自动映射器 map 复杂类型

[英]How to map Complex type using automapper

具有复杂嵌套映射的 Automapper。 我正在尝试 map mydestinationArrayField 和 dest1Array,这里将源对象列表复制到 dest1array。

这是我的源和目标课程。

namespace AutomapperDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                SourceObject request = new SourceObject()
                {
                    sourceTypeField = "1",
                    SourceObj1Field = new SourceObj1
                    {
                        SourceObj1Id = "1",
                        SourceObjListss = new List<SourceInnerObjList>
                       {

                       new SourceInnerObjList
                       {
                          SourceObjListItem1Id = 1


                       },
                       new SourceInnerObjList
                       {
                           SourceObjListItem1Id = 2

                       }
                   }

                    }
                };
                var mapper = CreateMapper();
                DestinationObject destination = new DestinationObject();
                destination = mapper.Map<DestinationObject>(request);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public static IMapper CreateMapper()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.AllowNullDestinationValues = true;
                cfg.CreateMap<SourceObject, DestinationObject>()
               .ForMember(dest => dest.destinationTypeField, o => o.MapFrom(src => src.sourceTypeField))
               .ForMember(dest => dest.destinationObjectArrayField, o => o.MapFrom(src => new destinationObjectArray()
               {
                   mydestinationArrayField = src.SourceObj1Field.SourceObjListss.Select(x => x.SourceObjListItem1Id).FirstOrDefault().ToString(), //this gives error

                   //dest1Array = src.SourceObj1Field.SourceObjListss // here source objectlist to be copied to dest1array

               }));
            });

            return config.CreateMapper();
        }

    }
}


namespace Automapper
{
    public class SourceObject
    {
        public string sourceTypeField;
        public SourceObj1 SourceObj1Field { get; set; }
    }
    public class SourceObj1
    {
        public string SourceObj1Id { get; set; }

        public ICollection<SourceInnerObjList> SourceObjListss { get; set; }
    }

    public class SourceInnerObjList
    {
        public int SourceObjListItem1Id { get; set; }
        public int SourceObjListItem2d { get; set; }

    }
    public class SourceInnerObj2List
    {
        public int? mycount { get; set; }
        public int? yourcount { get; set; }
    }

}


namespace Automapper
{
    public class DestinationObject
    {
        public string destinationTypeField;
        public destinationObjectArray[] destinationObjectArrayField;
    }

    public class destinationObjectArray
    {
        public string mydestinationArrayField;

        public string myField1;

        public destinationInnerObject1Array[] dest1Array;

        public destinationInnerObject2Array[] dest2Array;
    }
    public class destinationInnerObject1Array
    {
        public string destinationInnerObjectItem11;
        public string destinationInnerObjectItem21;
    }
    public class destinationInnerObject2Array
    {
        public string categoryTypeField;

        public string valueField;

        public string NumberField;
    }
}

在执行映射时,我收到“缺少类型 map 配置或不支持的映射”。

无论我如何配置忽略或自定义映射,它似乎都不喜欢这种嵌套。 任何 Automapper 专家都可以告诉我如何使用像这样的复杂 object 进行映射。

您的第二个 ForMember 似乎不起作用:

.ForMember(dest => dest.destinationObjectArrayField, o => o.MapFrom(src => new destinationObjectArray() //...

因为在您定义 map 以返回destinationObjectArray()而不是destinationObjectArray []!

所以有一个 map 像:

目标对象数组字段 -> 目标对象数组()

并且没有像 map 这样的:

目的地对象阵列字段->目的地对象阵列[]

Automapper 正在告诉你这一点。

你应该这样做:

    cfg.CreateMap<SourceObject, DestinationObject>()
                .ForMember(dest => dest.destinationTypeField, o => o.MapFrom(src => src.sourceTypeField))
                .ForMember(dest => dest.destinationObjectArrayField,
                    o => o.MapFrom(
                        src => src.SourceObj1Field
                            .SourceObjListss
                            .Select(x => new destinationObjectArray
                            {
                                myField1 = $"first_id: {x.SourceObjListItem2d} second_id: {x.SourceObjListItem1Id}"
                            })
                            .ToArray()
                    ));
    });

强烈建议清理和格式化代码,看起来你只是迷路了。 IDE 可以提供帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM