230 votes

AutoMapper : « ignorer le reste ? »

Y a-t-il un moyen de dire AutoMapper d’ignorer toutes les propriétés sauf ceux qui est mappés de manière explicite ?

J’ai des classes DTO externes qui sont susceptibles de changer de l’extérieur et je veux éviter de spécifier chaque propriété à ignorer explicitement, car l’ajout de nouvelles propriétés cassera la fonctionnalité (cause exceptions) lorsque vous essayez de mapper dans mes propres objets.

225voto

Robert Schroeder Points 1306

J’ai mis à jour extension de Gencer peut pour ne pas écraser toutes les cartes existantes.

Utilisation :

88voto

Can Gencer Points 4644

C'est une extension de la méthode que j'ai écrit qui ignore tous les non-existence de propriétés de la destination. Vous ne savez pas si il sera encore utile que la question est plus de deux ans, mais je suis tombé sur le même problème d'avoir à ajouter beaucoup de manuel d'Ignorer les appels.

public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>
(this IMappingExpression<TSource, TDestination> expression)
{
    var flags = BindingFlags.Public | BindingFlags.Instance;
    var sourceType = typeof (TSource);
    var destinationProperties = typeof (TDestination).GetProperties(flags);

    foreach (var property in destinationProperties)
    {
        if (sourceType.GetProperty(property.Name, flags) == null)
        {
            expression.ForMember(property.Name, opt => opt.Ignore());
        }
    }
    return expression;
}

Utilisation:

Mapper.CreateMap<SourceType, DestinationType>()
                .IgnoreAllNonExisting();

Mise à JOUR: Apparemment, cela ne fonctionne pas correctement si vous avez personnalisé les mappages parce qu'il remplace. Je suppose que cela pourrait encore fonctionner si l'appel IgnoreAllNonExisting d'abord, puis les mappages personnalisés plus tard.

schdr a une solution (comme une réponse à cette question) qui utilise Mapper.GetAllTypeMaps() pour trouver les propriétés qui sont déchargés de la mémoire et de l'auto de les ignorer. Semble être une solution plus robuste pour moi.

86voto

Yohanb Points 281

J’ai été capable de faire cela de la manière suivante :

Remarque : J’utilise AutoMapper v.2.0.

9voto

Jimmy Bogard Points 8294

Comment préférez-vous spécifier que certains membres être ignorés ? Y a-t-il une convention, ou la classe de base ou un attribut, que vous souhaitez postuler ? Une fois que vous entrez dans l’entreprise de préciser tous les mappages explicitement, je ne sais pas quelle valeur vous obtiendriez hors AutoMapper.

7voto

gm1886 Points 11

Cela semble une vieille question mais pensais que poster ma réponse pour ceux qui cherchent d’autre comme si j’étais.

J’utilise ConstructUsing, initialiseur d’objet couplé avec ForAllMembers ignorer par exemple

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X