2012-06-25 27 views
27

tengo el siguiente modelo:Usando AutoMapper para asignar la propiedad de un objeto a una cadena

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

Quiero ser capaz de utilizar AutoMapper para mapear la propiedad Name del tipo Tag a una propiedad de cadena de uno de mis viewmodels.

He creado una resolución personalizada para tratar de manejar este mapeo, usando el siguiente código:

public class TagToStringResolver : ValueResolver<Tag, string> 
    { 
     protected override string ResolveCore(Tag source) 
     { 
      return source.Name ?? string.Empty; 
     } 
    } 

estoy mapeo usando el siguiente código:

Mapper.CreateMap<Tag, String>() 
    .ForMember(d => d, o => o.ResolveUsing<TagToStringResolver>()); 

Cuando ejecuto la aplicación I obtenga el error:

Custom configuration for members is only supported for top-level individual members on a type.

¿Qué estoy haciendo mal?

Respuesta

40

Esto se debe a que está intentando asignar al tipo de destino real en lugar de una propiedad del tipo de destino. Se puede lograr lo que quiere con:

Mapper.CreateMap<Tag, string>().ConvertUsing(source => source.Name ?? string.Empty); 

aunque sería mucho más simple sólo para anular ToString de la clase de etiqueta.

+0

Gracias Rob. Terminé yendo con tu sugerencia para anular ToString en la clase Tag. – marcusstarnes

+0

Gracias por esto. Fuera de ingenuidad, estaba usando 'ForMember()' cuando debería haber estado usando 'ConvertUsing()'. –

9

ForMember significa que está proporcionando la asignación de un miembro donde desea una asignación entre tipo. En su lugar, utilice la siguiente:

Mapper.CreateMap<Tag, String>().ConvertUsing<TagToStringConverter>(); 

Y Converter es

public class TagToStringConverter : ITypeConverter<Tag, String> 
{ 
    public string Convert(ResolutionContext context) 
    { 
     return (context.SourceValue as Tag).Name ?? string.Empty; 
    } 
} 
+0

Esto me ayudó a mapear una entidad completa. Tuve que asignar un ViewModel a una Entity, y este era el camino a seguir, ¡gracias! – jpgrassi

+0

¡Muy buena característica, gracias Patrick! –

Cuestiones relacionadas