web-dev-qa-db-fra.com

Utilisation d'AutoMapper pour mapper la propriété d'un objet sur une chaîne

J'ai le modèle suivant:

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

Je veux pouvoir utiliser AutoMapper pour mapper la propriété Name du type Tag à une propriété de chaîne dans l'un de mes modèles d'affichage.

J'ai créé un résolveur personnalisé pour essayer de gérer ce mappage, en utilisant le code suivant:

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

Je mappe en utilisant le code suivant:

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

Lorsque j'exécute l'application, j'obtiens l'erreur:

La configuration personnalisée des membres n'est prise en charge que pour les membres individuels de niveau supérieur d'un type.

Qu'est-ce que je fais mal?

36
marcusstarnes

Cela est dû au fait que vous essayez de mapper sur le type de destination réel plutôt que sur une propriété du type de destination. Vous pouvez réaliser ce que vous voulez avec:

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

bien qu'il serait beaucoup plus simple de remplacer ToString sur la classe Tag.

52
Rob West

ForMember signifie que vous fournissez un mappage pour un membre où vous souhaitez un mappage entre les types. Utilisez plutôt ceci:

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

Et Converter est

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