Tengo un problema con AutoMapper 2.1.267.0 cuando trabajo con objetos que contienen colecciones de clases derivadas. He aislado mi problema en un escenario más simple con las siguientes clases:AutoMapper no funciona con la colección de clases derivadas
public class ClassABase
{
public string Name { get; set; }
}
public class ClassA : ClassABase
{
public string Description { get; set; }
}
public class ClassBBase
{
public string Title { get; set; }
}
public class ClassB : ClassBBase
{
public string Text { get; set; }
}
public class ContainerA
{
public IList<ClassA> ClassAList { get; set; }
public ClassA ClassA { get; set; }
}
public class ContainerB
{
public IList<ClassB> ClassBList { get; set; }
public ClassB ClassB { get; set; }
}
y estas asignaciones
public class ClassABaseToClassBBase : Profile
{
protected override void Configure()
{
CreateMap<ClassABase, ClassBBase>()
.Include<ClassA, ClassB>()
.ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Name));
Mapper.AssertConfigurationIsValid();
}
}
public class ClassAToClassB : Profile
{
protected override void Configure()
{
CreateMap<ClassA, ClassB>()
.ForMember(dest => dest.Text, opt => opt.MapFrom(src => src.Description));
Mapper.AssertConfigurationIsValid();
}
}
public class ContainerAToContainerB : Profile
{
protected override void Configure()
{
CreateMap<ContainerA, ContainerB>()
.ForMember(dest => dest.ClassBList,
opt => opt.MapFrom(src => Mapper.Map<IList<ClassA>, IList<ClassB>>(src.ClassAList)))
.ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src.ClassA));
}
}
Aquí está la inicialización
Mapper.Initialize(x =>
{
x.AddProfile<ClassABaseToClassBBase>();
x.AddProfile<ClassAToClassB>();
x.AddProfile<ContainerAToContainerB>();
});
y un diagrama que resume todo (Las flechas rojas representan las asignaciones de AutoMapper)
He asignado una instancia de ContainerA a ContainerB. Este primer escenario funciona correctamente. El objeto de destino está completamente lleno como se muestra en la imagen de abajo:
Pero si añado este mapeo
public class ClassBBaseToClassB : Profile
{
protected override void Configure()
{
CreateMap<ClassBBase, ClassB>()
.ForMember(dest => dest.Text, opt => opt.Ignore());
Mapper.AssertConfigurationIsValid();
}
}
Mapper.Initialize(x =>
{
x.AddProfile<ClassABaseToClassBBase>();
x.AddProfile<ClassAToClassB>();
x.AddProfile<ClassBBaseToClassB>();
x.AddProfile<ContainerAToContainerB>();
});
el resultado es
Las propiedades "Texto" de todos los elementos de la colección se vuelven nulas. Como puede ver en la imagen, la propiedad "Texto" del objeto containerB.ClassB todavía se mapea correctamente. Esto solo ocurre con las colecciones. No sé lo que está pasando. ¿Alguna pista?
Gracias
qué resultados espera usted? – Cybermaxs
Esperaba que todos los elementos de containerB.ClassBList se llenaran por completo, en lugar de tener propiedades nulas. – peflorencio