У меня есть один класс Model в моем классе Business Logic, Pet.
В этом классе у меня есть свойство дискриминатора под названием Type (int = 1, 2, 3,...)
Окончательное отображение должно быть Dto конкретных производных классов.
Я использую ConstructUsing, но возникает исключение переполнения стека, поскольку оно имеет рекурсию по правилу сопоставления базового типа.
Производные классы 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
{
}
}
Обновление: в этой версии все работает правильно.
cfg.CreateMap<Pet, Dto.Pet>()
.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(src, new Dto.Pet { }, context);
}
})
;
cfg.CreateMap<Pet, Dto.Dog>();
cfg.CreateMap<Pet, Dto.Cat>();
cfg.CreateMap<Pet, Dto.Mouse>();
default: return context.Mapper.Map(src, new Dto.Pet { }, context);
- person Marco Scavarda   schedule 03.02.2019default: return context.Mapper.Map<Pet, Dto.Pet>(src);
. Это работаетdefault: return context.Mapper.Map<Pet, Dto.Pet>(src, new Dto.Pet { });
- person Marco Scavarda   schedule 03.02.2019default: return context.Mapper.Map<Pet, Dto.Pet>(src);
вызываться рекурсивно? Что и вызывает ТАК. Возможно, что-то вроде условногоConstructUsing
решит эту проблему, но, похоже, этого не существует. - person devNull   schedule 03.02.2019