2016-06-28 22 views
6

Come posso ignorare il mapping se il tipo di proprietà è diverso con lo stesso nome di proprietà? Per impostazione predefinita si tratta di un errore di lancio.automapper - ignora il mapping se il tipo di proprietà è diverso con lo stesso nome di proprietà - C#

Conosco un modo per specificare il nome della proprietà da ignorare ma non è quello che voglio.

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

Perché in futuro potrei aggiungere nuove proprietà. Quindi ho bisogno di ignorare la mappatura per tutte le proprietà con diversi tipi di dati.

+0

Hai provato .ForAllMembers (opt => opt .Condition (IsValidType))); Si prega di vedere la mia risposta per esempio il codice sorgente. – Vinod

risposta

4

Si dovrebbe usare ignorare per le proprietà che devono essere ignorati:

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

Potrei aggiungere nuove proprietà in futuro. quindi ho bisogno di ignorare la mappatura per tutte le proprietà con diversi tipi di dati – JerryGoyal

+0

Non è possibile. Tutto quello che puoi fare è scrivere autotest sulla configurazione, che ti avviserà se il campo problema è stato aggiunto –

0

Un modo per elaborare tutte le proprietà per il tipo è quello di utilizzare .ForAllMembers (opt => opt.Condition (IsValidType))). Ho usato una nuova sintassi per l'utilizzo di AutoMapper, ma dovrebbe funzionare anche con la vecchia sintassi.

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" non può essere applicato all'operando di tipo void .. questo errore sta arrivando – JerryGoyal

+0

Puoi postare maggiori dettagli o aggiornare la tua domanda con cosa hai provato? – Vinod

3

È possibile utilizzare ForAllMembers() per impostare la condizione di mappatura appropriata:

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

È anche possibile applicarlo a livello globale utilizzando ForAllMaps():

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

Ho provato la seconda opzione 'ForAllMaps()' e sto ricevendo un errore nell'ultima riga per 'map.Ignore()'. Il metodo 'Ignore' non è stato trovato. Ottenere questo errore => 'CS1061 \t 'PropertyMap' non contiene una definizione per 'Ignora' e non è possibile trovare alcun metodo di estensione 'Ignora' che accetta un primo argomento di tipo 'PropertyMap' (ti manca una direttiva using o un riferimento assembly ?) 'Pensieri? – Shiva

+0

@Shiva, prova 'map.Ignored = true'. Forse hanno cambiato l'API da quando è stata scritta la risposta. – haim770