2017-06-13 3 views
1
public class BaseViewModel 
{ 
    public MyEnum EnumValue {get;set;} 
    public string PropA { get; set; } 
} 

public class Enum1ViewModel : BaseViewModel 
{ 
    public string PropB {get; set;} 
} 

public class Enum2ViewModel : BaseViewModel 
{ 
    public string PropC {get; set;} 
} 

public class Enum3ViewModel : BaseViewModel 
{ 
    public string PropD {get; set;} 
} 

public enum MyEnum 
{ 
    Value1, 
    Value2, 
    Value3 
} 

public class MyEntity 
{ 
    public MyEnum EnumValue {get; set;} 
    public string PropA {get;set;} 
    public string PropB {get;set;} 
    public string PropC {get;set;} 
    public string PropD {get;set;} 
    public string PropE {get;set;} 
} 

public class MapperProfile : Profile 
{ 
    public MapperProfile() 
    { 
     CreateMap<Enum1ViewModel, MyEntity>() 
      .ForMember(m => m.EnumValue, o => o.UseValue(MyEnum.Value1) 
      .ForMember(m => m.PropC, o => o.Ignore()) 
      .ForMember(m => m.PropD, o => o.Ignore()) 
      .ForMember(m => m.PropE, o => o.Ignore()); 

     CreateMap<Enum2ViewModel, MyEntity>() 
      .ForMember(m => m.EnumValue, o => o.UseValue(MyEnum.Value2) 
      .ForMember(m => m.PropB, o => o.Ignore()) 
      .ForMember(m => m.PropD, o => o.Ignore()) 
      .ForMember(m => m.PropE, o => o.Ignore()); 

     CreateMap<Enum3ViewModel, MyEntity>() 
      .ForMember(m => m.EnumValue, o => o.UseValue(MyEnum.Value3) 
      .ForMember(m => m.PropB, o => o.Ignore()) 
      .ForMember(m => m.PropC, o => o.Ignore()) 
      .ForMember(m => m.PropE, o => o.Ignore()); 

      // Question: How do I do the reverse mapping?? 
    } 
} 

Ich habe diese Frage zu Jimmy Bogard auf Twitter, aber ich dachte, dass die Antwort möglicherweise mehr Leute dann mir nur helfen könnte.AutoMapper: Mapping-Klasse Viewmodels auf dem Wert eines Aufzählungs je

Wenn ich Jimmys Antwort bekomme, bevor er sie hier veröffentlicht, oder jemand von euch, werde ich es selbst beantworten.

+0

Was ist das Problem hier im Code? –

Antwort

1

Nein, dies nicht möglich ist, siehe https://github.com/AutoMapper/AutoMapper/issues/258 . Es gab eine Pull-Anfrage, um es zu adressieren, aber es würde nicht mit ORMs wie EF funktionieren, was mehr Verwirrung als alles andere verursachen würde.

Ihre beste Wette ist eine switch Erklärung über die Enum und rufen Sie Mapper.Map in Ihrem Anwendungscode (der wahrscheinlich ist, ist auf jeden Fall offensichtlich).

+0

Das ist genau das, was ich am Ende gefunden habe, eine switch-Anweisung in einer Erweiterungsmethode. Danke nochmal für die schnelle Hilfe! –

0

da beide Klassen verwenden, um die ENUM dies sollte so einfach sein wie:

CreateMap<MyEntity, Enum1ViewModel>(); 
CreateMap<MyEntity, Enum2ViewModel>(); 
CreateMap<MyEntity, Enum3ViewModel>(); 
0

können Sie versuchen, Ihr Ansichtsmodell abbildet direkt an MyEntity und (je nach Konfiguration) AutoMapper kann einfach keine Eigenschaften zuordnen, die nicht Gegenwart in der ehemaligen.

Wenn das nicht für Sie arbeiten, wäre eine Option ähnlich wie dies bedingte Zuordnung zu verwenden:

Mapper.CreateMap<MyEntity , Enum1ViewModel>() 
.ForMember(
    destination => destination.PropA , 
    option => 
    { 
     option.Condition(rc => 
     { 
      var myViewModel = (Enum1ViewModel)rc.InstanceCache.First().Value; 
      return myViewModel.EnumValue == MyEnum.Value1; 
     }); 

     option.MapFrom(source => source.PropA); 
    } 
); 

Weitere Informationen hier: https://github.com/AutoMapper/AutoMapper/wiki/Conditional-mapping

Verwandte Themen