2010-12-22 74 views
9

Supongamos que tengo tres clases que son subclases de una clase base:¿Cómo uso AutoMapper para mapear múltiples subclases en una clase?

public class BaseClass 
{ 
    public string BaseName { get; set; } 
} 

public class Subclass1 : BaseClass 
{ 
    public string SubName1 { get; set; } 
} 

public class Subclass2 : BaseClass 
{ 
    public string SubName2 { get; set; } 
} 

public class Subclass3 : BaseClass 
{ 
    public string SubName3 { get; set; } 
} 

quisiera asignar éstos a una clase de modelo de vista que se ve así:

public class ViewModel 
{ 
    public string BaseName { get; set; } 
    public string SubName1 { get; set; } 
    public string SubName2 { get; set; } 
    public string SubName3 { get; set; } 
} 

ViewModel simplemente combina las propiedades en todas las subclases y lo aplana. He intentado configurar la asignación de este modo:

AutoMapper.CreateMap<BaseClass, ViewModel>(); 

Entonces intenté agarrar los datos de mi base de datos de este modo:

var items = Repo.GetAll<BaseClass>(); 
AutoMapper.Map(items, new List<ViewModel>()); 

Sin embargo, lo que termina está sucediendo que sólo la propiedad BaseName se completará en el ViewModel. ¿Cómo configuraría AutoMapper para que también mapeara las propiedades en las subclases?

+1

Quizás quiso decir ... (diferentes nombres de subclases) clase pública Subclase2: BaseClass { cadena pública SubName1 {get; conjunto; } } clase pública Subclase2: BaseClass { cadena pública SubName2 {get; conjunto; } } clase pública Subclass3: BaseClass { cadena pública SubName3 {get; conjunto; } } – Brook

Respuesta

12

Parece que hay un error o limitación en AutoMapper que necesita correspondiente TSource y TDestination jerarquías. Teniendo en cuenta:

public class BaseClass { 
    public string BaseName { get; set; } 
} 

public class Subclass1 : BaseClass { 
    public string SubName1 { get; set; } 
} 

se necesitan los siguientes modelos de vista:

public class ViewModel { 
    public string BaseName { get; set; } 
} 
public class ViewModel1 : ViewModel { 
    public string SubName1 { get; set; } 
} 

El siguiente código a continuación funciona:

Mapper.CreateMap<BaseClass, ViewModel>() 
     .Include<Subclass1, ViewModel1>(); 
Mapper.CreateMap<Subclass1, ViewModel1>(); 

var items = new List<BaseClass> {new Subclass1 {BaseName = "Base", SubName1 = "Sub1"}}; 
var viewModels = Mapper.Map(items, new List<ViewModel>()); 
+0

Si el mapeo infantil tiene una resolución especial para los miembros, ¿ese mapa debe crearse antes de que se incluya con el mapeo padre? – ps2goat

1

Prueba esto:

AutoMapper.CreateMap<BaseClass, ViewModel>() 
    .Include<Subclass1, ViewModel>() 
    .Include<Subclass2, ViewModel>() 
    .Include<Subclass3, ViewModel>(); 
AutoMapper.CreateMap<Subclass1, ViewModel>(); 
AutoMapper.CreateMap<Subclass2, ViewModel>(); 
AutoMapper.CreateMap<Subclass3, ViewModel>(); 

var items = Repo.GetAll<BaseClass>(); 
AutoMapper.Map(items, new List<ViewModel>()); 
Cuestiones relacionadas