web-dev-qa-db-fra.com

Comment configurer le mappage conditionnel dans AutoMapper?

Supposons que j'ai les entités (classes) suivantes

public class Target
{
    public string Value;
}


public class Source
{
    public string Value1;
    public string Value2;
}

Maintenant, je veux configurer Auto Map, mapper Value1 à Value si Value1 commence par "A", mais sinon je veux mapper Value2 à Value.

Voici ce que j'ai jusqu'à présent:

Mapper
    .CreateMap<Source,Target>()
    .ForMember(t => t.Value, 
        o => 
            {
                o.Condition(s => 
                    s.Value1.StartsWith("A"));
                o.MapFrom(s => s.Value1);
                  <<***But then how do I supply the negative clause!?***>>
            })

Cependant, la partie qui m'échappe encore est de savoir comment dire à AutoMapper allez prendre s.Value2 en cas d'échec de la condition précédente.

Il me semble que l'API n'a pas été conçue aussi bien qu'elle pourrait l'être ... mais c'est peut-être mon manque de connaissances qui me gêne.

38
Alwyn

Essaye ça

 Mapper.CreateMap<Source, Target>()
        .ForMember(dest => dest.Value, 
                   opt => opt.MapFrom
                   (src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2));

L'option Condition est utilisée pour ajouter des conditions aux propriétés qui doivent être remplies avant que cette propriété ne soit mappée et l'option MapFrom est utilisée pour effectuer des mappages de membres source/destination personnalisés.

88
Tejal

Avec le mappage conditionnel, vous ne pouvez configurer que le moment où le mappage doit être exécuté pour la propriété de destination spécifiée.

Cela signifie donc que vous ne pouvez pas définir deux mappages avec des conditions différentes pour la même propriété de destination.

Si vous avez une condition comme "si la condition est vraie alors utilisez PropertyA sinon utilisez PropertyB" alors vous devriez le faire comme "Tejal" a écrit:

opt.MapFrom(src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2)
3
Marcus.D

AutoMapper vous permet d'ajouter des conditions aux propriétés qui doivent être remplies avant que cette propriété soit mappée.

Je faisais la cartographie avec certaines conditions énumérées, jetez un coup d'œil qui représente peu d'effort pour la communauté de mon côté.

}

.ForMember(dest => dest.CurrentOrientationName, 
             opts => opts.MapFrom(src => src.IsLandscape? 
                                        PageSetupEditorOrientationViewModel.Orientation.Landscape : 
                                        PageSetupEditorOrientationViewModel.Orientation.Portrait));
2
Khawaja Asim