2016-06-28 9 views
6

Wie kann ich die Zuordnung ignorieren, wenn sich der Eigenschaftstyp mit demselben Eigenschaftsnamen unterscheidet? Standardmäßig ist es Wurffehler.AutoMapper - Zuordnung ignorieren, wenn der Eigenschaftstyp mit demselben Eigenschaftsnamen unterschiedlich ist - C#

Mapper.CreateMap<EntityAttribute, LeadManagementService.LeadEntityAttribute>(); 

Model = Mapper.Map<EntityAttribute, LeadManagementService.LeadEntityAttribute>(EntityAttribute); 

Ich kenne einen Weg, um den Namen der Eigenschaft zu ignorieren, aber das ist nicht was ich will.

.ForMember(d=>d.Field, m=>m.Ignore()); 

Da in der Zukunft könnte ich neue Eigenschaften hinzufügen. Daher muss ich die Zuordnung für alle Eigenschaften mit unterschiedlichen Datentypen ignorieren.

+0

Haben Sie .ForAllMembers versucht (opt => opt .Condition (IsValidType))); Bitte beachten Sie meine Antwort zum Beispiel Quellcode. – Vinod

Antwort

4

sollten Sie Objekte ignorieren verwenden, die ignoriert werden sollen:

Mapper.CreateMap<EntityAttribute, LeadManagementService.LeadEntityAttribute>() 
    ForMember(d=>d.FieldToIgnore, m=>m.Ignore()); 
+1

Ich kann in der Zukunft neue Eigenschaften hinzufügen. Daher muss ich die Zuordnung für alle Eigenschaften mit unterschiedlichem Datentyp ignorieren – JerryGoyal

+0

Sie können nicht. Alles, was Sie tun können, ist Autotest auf Konfiguration schreiben, die Sie benachrichtigt, wenn Problemfeld hinzugefügt wird –

0

Eine Möglichkeit, alle Eigenschaften für den Typ zu verarbeiten ist .ForAllMembers zu verwenden (opt => opt.Condition (IsValidType))). Ich habe neue Syntax für AutoMapper verwendet, aber es sollte auch mit alter Syntax funktionieren.

using System; 
using AutoMapper; 

namespace TestAutoMapper 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var mapperConfiguration = new MapperConfiguration(cfg => cfg.CreateMap<Car, CarDto>() 
       .ForAllMembers(opt => opt.Condition(IsValidType))); //and how to conditionally ignore properties 
      var car = new Car 
      { 
       VehicleType = new AutoType 
       { 
        Code = "001DXT", 
        Name = "001 DTX" 
       }, 
       EngineName = "RoadWarrior" 
      }; 

      IMapper mapper = mapperConfiguration.CreateMapper(); 
      var carDto = mapper.Map<Car, CarDto>(car); 
      Console.WriteLine(carDto.EngineName); 

      Console.ReadKey(); 
     } 

     private static bool IsValidType(ResolutionContext arg) 
     { 
      var isSameType = arg.SourceType== arg.DestinationType; //is source and destination type is same? 
      return isSameType; 
     } 
    } 

    public class Car 
    { 
     public AutoType VehicleType { get; set; } //same property name with different type 
     public string EngineName { get; set; } 
    } 

    public class CarDto 
    { 
     public string VehicleType { get; set; } //same property name with different type 
     public string EngineName { get; set; } 
    } 

    public class AutoType 
    { 
     public string Name { get; set; } 
     public string Code { get; set; } 
    } 
} 
+0

"ForAllMembers" kann nicht auf Operanden vom Typ void angewendet werden .. Dieser Fehler wird – JerryGoyal

+0

können Sie mehr Details posten oder Ihre Frage mit was zu aktualisieren Du hast es versucht? – Vinod

3

Sie können ForAllMembers() Setup die entsprechende Abbildung Bedingung verwenden:

Mapper.Initialize(cfg => 
{ 
    cfg.CreateMap<EntityAttribute, LeadEntityAttribute>().ForAllMembers(memberConf => 
    { 
     memberConf.Condition((ResolutionContext cond) => cond.DestinationType == cond.SourceType); 
    }); 
} 

Sie können auch global gelten ForAllMaps() mit:

Mapper.Initialize(cfg => 
{ 
    // register your maps here 
    cfg.CreateMap<A, B>(); 

    cfg.ForAllMaps((typeMap, mappingExpr) => 
    { 
     var ignoredPropMaps = typeMap.GetPropertyMaps(); 

     foreach (var map in ignoredPropMaps) 
     { 
      var sourcePropInfo = map.SourceMember as PropertyInfo; 
      if (sourcePropInfo == null) continue; 

      if (sourcePropInfo.PropertyType != map.DestinationPropertyType) 
       map.Ignore(); 
     } 
    }); 
}); 
+0

Ich habe versucht die 2. Option 'ForAllMaps()' und bekomme einen Fehler in der letzten Zeile für 'map.Ignore()'. Die Methode 'Ignorieren' wurde nicht gefunden. Diesen Fehler erhalten => 'CS1061 \t 'PropertyMap' enthält keine Definition für 'Ignorieren' und keine Erweiterungsmethode 'Ignorieren', die ein erstes Argument vom Typ 'PropertyMap' akzeptiert, wurde gefunden (fehlt eine using-Direktive oder eine Assembly-Referenz) ?) 'Gedanken? – Shiva

+0

@Shiva, versuchen Sie stattdessen 'map.Ignored = true'. Vielleicht haben sie die API geändert, seit die Antwort geschrieben wurde. – haim770