2012-09-18 11 views
5

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)

enter image description here

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:

enter image description here


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>(); 
    }); 

enter image description here

el resultado es

enter image description here

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

+0

qué resultados espera usted? – Cybermaxs

+0

Esperaba que todos los elementos de containerB.ClassBList se llenaran por completo, en lugar de tener propiedades nulas. – peflorencio

Respuesta

1

Hola,

intenta cambiar la asignación entre los contenedores de esta manera:

public class ContainerAToContainerB : Profile 
    { 
     protected override void Configure() 
     { 
      CreateMap<ContainerA, ContainerB>() 
       .ForMember(dest => dest.ClassBList,opt=>opt.MapFrom(src=>src.ClassAList)) 
       .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src.ClassA)); 

     } 
} 
Cuestiones relacionadas