resolveusing - get e set c# automatico




Utilizzo di AutoMapper per mappare la proprietà di un oggetto a una stringa (2)

Ho il seguente modello:

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

Voglio essere in grado di utilizzare AutoMapper per mappare la proprietà Name del tipo Tag su una proprietà stringa in uno dei miei viewmodels.

Ho creato un resolver personalizzato per provare a gestire questa mappatura, utilizzando il seguente codice:

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

Sto mappando usando il seguente codice:

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

Quando eseguo l'applicazione ottengo l'errore:

La configurazione personalizzata per i membri è supportata solo per i singoli membri di livello superiore su un tipo.

Che cosa sto facendo di sbagliato?


ForMember significa che stai fornendo la mappatura per un membro in cui desideri un mapping tra tipo. Invece, usa questo:

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

E il convertitore è

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

Questo perché stai provando a mappare il tipo di destinazione effettivo piuttosto che una proprietà del tipo di destinazione. Puoi ottenere ciò che vuoi con:

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

anche se sarebbe molto più semplice sovrascrivere ToString sulla classe Tag.





automapper-2