为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法正确使用自动映射器来实现具有鉴别器的继承?

有没有办法正确使用自动映射器来实现具有鉴别器的继承?

C#
慕莱坞森 2022-08-20 17:27:30
我的业务逻辑 Pet 类中有一个 Model 类。在这个类中,我有一个名为Type的鉴别器属性(int = 1, 2, 3, ...)最终映射必须是特定派生类的 Dto。我使用 ConstructUsing,但它在 Stack Overflow Exception 上继续,因为它在基类型映射规则上有一个递归。派生的 Dto 类已正确映射,因为它们没有递归。还尝试了 PreserveReferences() 没有运气using AutoMapper;using System;using System.Collections.Generic;namespace ConsoleAppMapper{    class Program    {        static void Main(string[] args)        {            var mapper = new MapperConfiguration(cfg =>            {                cfg.CreateMap<Pet, Dto.Pet>()                    .PreserveReferences()                    .ForMember(dst => dst.Name, opt => opt.MapFrom(src => src.PetName))                    .ConstructUsing((src, context) =>                    {                        switch (src.Type)                        {                            case 1: return context.Mapper.Map<Pet, Dto.Dog>(src);                            case 2: return context.Mapper.Map<Pet, Dto.Cat>(src);                            case 3: return context.Mapper.Map<Pet, Dto.Mouse>(src);                            default: return context.Mapper.Map<Pet, Dto.Pet>(src);                        }                    })                ;                cfg.CreateMap<Pet, Dto.Dog>();                cfg.CreateMap<Pet, Dto.Cat>();                cfg.CreateMap<Pet, Dto.Mouse>();            }).CreateMapper();            var pets = new List<Pet>            {                new Pet { PetName = "Bob", Type = 1 },                new Pet { PetName = "Tom", Type = 2 },                new Pet { PetName = "Jerry", Type = 3 },                new Pet { PetName = "Duffy", Type = 4 },            };            var dtoList = mapper.Map<IEnumerable<Pet>, IEnumerable<Dto.Pet>>(pets);        }    }    public class Pet    {        public string PetName;        public int Type;    }}namespace Dto{    public class Pet    {        public string Name;    }    public class Dog : Pet    {    }    public class Cat : Pet    {    }    public class Mouse : Pet    {    }}
查看完整描述

1 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

这是我的完整解决方案,它涵盖了所有映射组合


using AutoMapper;

using System;

using System.Collections.Generic;


namespace ConsoleAppMapper

{

    class Program

    {

        static void Main(string[] args)

        {

            var mapper = new MapperConfiguration(cfg =>

            {

                cfg.CreateMap<Pet, Dto.Pet>()

                    .Include<Pet, Dto.Dog>()

                    .Include<Pet, Dto.Cat>()

                    .Include<Pet, Dto.Mouse>()


                    .ForMember(dst => dst.Name, opt => opt.MapFrom(src => src.PetName))

                    .ForMember(dst => dst.Description, opt => opt.Ignore())


                    .ConstructUsing((src, context) =>

                    {

                        switch (src.Type)

                        {

                            case 1: return context.Mapper.Map(src, new Dto.Dog { }, context);

                            case 2: return context.Mapper.Map(src, new Dto.Cat { }, context);

                            case 3: return context.Mapper.Map(src, new Dto.Mouse { }, context);

                            default: return context.Mapper.Map(src, new Dto.Pet { }, context);

                        }

                    })

                ;


                cfg.CreateMap<Pet, Dto.Dog>()

                    .ForMember(dst => dst.Description, opt => opt.MapFrom(src => "This is a dog"))

                ;


                cfg.CreateMap<Pet, Dto.Cat>()

                    .ForMember(dst => dst.Description, opt => opt.MapFrom(src => "This is a cat"))

                ;


                cfg.CreateMap<Pet, Dto.Mouse>()

                    .ForMember(dst => dst.Description, opt => opt.MapFrom(src => "This is a mouse"))

                ;


            }).CreateMapper();


            // Test

            var pets = new List<Pet>

            {

                new Pet { PetName = "Bob", Type = 1 },

                new Pet { PetName = "Tom", Type = 2 },

                new Pet { PetName = "Jerry", Type = 3 },

                new Pet { PetName = "Duffy", Type = 4 },

            };


            // Full mixed collection

            var dtoList = mapper.Map<IEnumerable<Pet>, IEnumerable<Dto.Pet>>(pets);


            // Single item

            var dog = mapper.Map<Pet, Dto.Pet>(pets[0]); 

            var dog2 = mapper.Map<Pet, Dto.Dog>(pets[0]); 

        }

    }


    public class Pet

    {

        public string PetName;

        public int Type;

    }

}


namespace Dto

{

    public class Pet

    {

        public string Name;

        public string Description;

    }


    public class Dog : Pet

    {

    }


    public class Cat : Pet

    {

    }


    public class Mouse : Pet

    {

    }

}


查看完整回答
反对 回复 2022-08-20
  • 1 回答
  • 0 关注
  • 71 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信