2011-07-21 33 views
6

Necesito ayuda con una asignación especial con AutoMapper. Quiero asignar una colección de objetos a una colección de cadenas.AutoMapper: asignación de una colección de objetos a una colección de cadenas

así que tengo una etiqueta ClassD

public class Tag 
{ 
    public Guid Id { get; set; } 
    public string Name {get; set; } 
} 

Que en un modelo que tengo un IList de esta clase. Ahora quiero asignar el nombre a una colección de cadenas.

Ése es cómo definir la regla de asignación:

.ForMember(dest => dest.Tags, opt => opt.ResolveUsing<TagNameResolver>()) 

Y aquí está mi ValueResolver:

protected override string ResolveCore(Tag source) 
{ 
    return source.Name; 
} 

pero u .. saben que no trabajan ;-) Así que tal vez alguien sabe cómo hacerlo es correcto y puede ayudarme.

THX mucho

Ene

Sooo .. u quería más detalles .. aquí u conseguirlo .. pero tengo acortarlo;)

lo que el modelo:

public class Artocle 
{ 
    public Guid Id { get; set; } 
    public string Title {get; set; } 
    public string Text { get; set; } 
    public IList<Tag> Tags { get; set; } 
} 

Y el modelo Tag puede ver arriba.

Quiero asignarlo a un ArticleView ... necesito el modelo de etiqueta solo para un contexto comercial, no para el resultado.

Así que aquí es el modelo de vista i necesidad de mapear:

public class ArticleView 
{ 
    public Guid Id { get; set; } 
    public string Title { get; set; } 
    public string Text { get; set; } 
    public IList<string> Tags { get; set; } // The mapping problem :-) 
} 

así que tengo un programa previo de las asignaciones. Mi Mapeo se ve así:

Mapper.CreateMap<Article, ArticleView>() 
.ForMember(dest => dest.Tags, opt => opt.ResolveUsing<TagNameResolver>()) 

Y mapa que manuelly con un método especial

public static ArticleView ConvertToArticleView(this Article article) 
    { 
     return Mapper.Map<Article, ArticleView>(article); 
    } 
+0

¿Puede proporcionar más información sobre las clases de origen y destino? –

+0

Así que eso es todo lo que hago :) Espero que mi edición pueda ayudar :) – Smokefoot

Respuesta

13

Una unidad de prueba validado los siguientes sería el mapa de IList <Tag> a IList <string>

private class TagNameResolver : ValueResolver<IList<Tag>, IList<string>> 
     { 
      protected override IList<string> ResolveCore(IList<Tag> source) 
      { 
       var tags = new List<string>(); 
       foreach (var tag in source) 
       { 
        tags.Add(tag.Name); 
       } 
       return tags; 
      } 
     } 

Esta es una manera más corta de crear el mapa:

.ForMember(dest => dest.Tags, opt => opt.MapFrom(so => so.Tags.Select(t=>t.Name).ToList())); 
+1

Maldita sea ... es tan fácil ^^ muchas gracias ha pensado sobre esta manera: D * vergüenza * – Smokefoot

+0

Su bienvenida. Agregué una opción corta también. –

+1

Oh, tu segunda opción es genial. Muchas gracias. – Smokefoot

Cuestiones relacionadas