2014-06-23 9 views
9

Proszę, czy ktoś może doradzić, jak korzystać z mapowania warunkowego w AutoMaperze, aby odwzorować wartość w obiekcie TARGET z obiektu SOURCE na podstawie istniejącej wartości właściwości TARGET?C# Mapowanie warunkowe AutoMapowania na podstawie wartości docelowej

Więc moja klasa źródłem jest:

public class UserDetails 
{ 
    public String Nickname { get; set; } 
} 

Moja klasa celem jest:

public class ProfileViewModel 
{ 
    public Boolean NicknameIsVisible { get; set; 
    public String Nickname { get; set; } 
} 

Chcę ustawić "przydomek" wartości nieruchomości w systemie TARGET, aby dopasować "nickname" wartość nieruchomości w ŹRÓDŁO tylko wtedy, gdy wartość docelowa "NicknameIsVisible" jest już ustawiona na PRAWDA, w przeciwnym razie chcę ustawić wartość właściwości "Pseudonim" TARGET na pusty ciąg znaków.

Próbowałem coś takiego (co przyzwyczajenie kompilacji) ...

Mapper.CreateMap<UserDetails, ProfileViewModel>() 
.ForMember(
      destination => destination.Nickname, 
      option => option. 
       .MapFrom(
        source => source.NicknameIsVisible ? 
        source.Nickname : 
        String.Empty) 
); 

ale „NicknameIsVisible” nie jest własnością mojego ŹRÓDŁO ale mój cel.

BTW, Mój ProfileViewModel jest związany z trzema podmiotami przy użyciu metody Owaina Wragga (http://consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx) i jest to kolejna jednostka, która nadaje wartość właściwości "NicknameIsVisible".

Proszę, czy ktoś może zaproponować odpowiednią składnię do rozwiązania tego problemu?

Odpowiedz

2

Korzystanie przykład devduder jest teraz mam następujący kod, który kompiluje:

.ForMember(
    destination => destination.Nickname, 
    option => 
    { 
     option.Condition(resolutionContext => 
      (resolutionContext.InstanceCache.First().Value as ProfileViewModel).NicknameIsVisible); 
     option.MapFrom(source => source.Nickname); 
    } 
); 

Jednak mimo to kompiluje i działa przez to nie jest z wypełniania destination.Nickname byle co.

Edit: musiałem zmienić kolejność moim mapowania tak preferencje sprzeciw

(która ma wartości dla „NicknameIsVisible” obiektu została odwzorowana pierwszy więc wartość była dostępna do testowania przeciwko!) więc wezwanie do mojego trójdrożnym mapowania było:

var profileViewModel = EntityMapper.Map<ProfileViewModel>(preferences, member, account); 

Zapewniło to, że preferencje obiekt został odwzorowany na ViewModel, potem warunkowego mapowanie dla konta obiekt może mieć miejsce po ustawieniu wartości.

To jest moje rozwiązanie, ale nie mogę głosować na własną odpowiedź!

+0

Myślę, że może to być spowodowane tym, że właściwość nie została ustawiona w miejscu docelowym, więc nie może jej użyć. Prawdopodobnie będę musiał zmienić kolejność mapowania, aby osiągnąć to, czego wymagam. Skorzystam z moich ustaleń. – Dib

+1

Daj nam znać, jak idziesz, chciałbym wiedzieć, co znajdziesz. – devduder

+0

OK, zrobi. Mam nadzieję, że będę pracował nad tym wieczorem. – Dib

14

Spróbuj tego:

Mapper.CreateMap<UserDetails, ProfileViewModel>() 
.ForMember(
     destination => destination.Nickname, 
     option => 
     { 
      option.Condition(rc => 
      { 
       var profileViewModel = (ProfileViewModel)rc.InstanceCache.First().Value; 
       return profileViewModel.NicknameIsVisible; 
      }); 

      option.MapFrom(source => source.Nickname); 
     } 
); 
+0

Dziękuję. Spróbuję tego później i dam ci znać. – Dib

+0

Dostaję błędy kompilacji z twojego przykładu. Zmieniłem go poniżej na moją wersję poniżej, aby uzyskać kod do kompilacji: – Dib

Powiązane problemy