У меня есть следующие модели:
public class A
{
public int a1;
public int a2;
public int a3;
public int a4;
public B b;
}
public class B
{
public int b1;
public int b2;
public C c;
}
public class C
{
public int c1;
public int c2;
}
public class A_DTO
{
public int a1;
public int a2;
public int a3;
public B_DTO b;
}
public class B_DTO
{
public int b1x;
public int b2;
public C_DTO c;
}
public class C_DTO
{
public int c1;
}
И вот мои цели:
- Сопоставить каждого члена в источнике с участником в пункте назначения с тем же именем (включая наследование))
- Создать пользовательскую карту для Abb1 -> A_DTO.b.b1x
- Явно указать, что для Abcc2
- нет сопоставления, если в источнике есть несопоставленное свойство, котороеявно не отображается и не может быть отображено на основе того же имени, выбросить исключение
А вот конфигурация, которую я использую для этого:
var config = new MapperConfiguration(
cfg => {
cfg.CreateMap<A, A_DTO>(MemberList.Source);
cfg.CreateMap<B, B_DTO>(MemberList.Source)
.ForMember(dest => dest.b1x, opt => opt.MapFrom(src => src.b1));
cfg.CreateMap<C, C_DTO>(MemberList.Source)
.ForSourceMember(src => src.c2, opt => opt.DoNotValidate());
}
);
А вот тестовые данныеЯ использовал:
var mapper = config.CreateMapper();
A a = new A()
{
a1 = 1,
a2 = 2,
a3 = 3,
a4 = 10,
b = new B
{
b1 = 4,
b2 = 5,
c = new C
{
c1 = 6,
c2 = 7
}
}
};
A_DTO aDto = new A_DTO();
mapper.Map(a, aDto);
Это соответствует всем перечисленным выше условиям, кроме последнего, потому что a4
не существует на A_DTO
, и я все еще не получаю исключение.(Принимая во внимание, что, если я удаляю .ForSourceMember(src => src.c2, opt => opt.DoNotValidate())
, он выдает исключение для c2
.)