2016-05-12 12 views

Antwort

4

Der entscheidende Punkt ist die Quelle Eigenschaft Art und Karte nur zu prüfen, ob diese Voraussetzungen erfüllt sind (!= null für einen Referenztyp, != default für einen Werttyp):

Mapper.CreateMap<Src, Dest>() 
    .ForAllMembers(opt => opt.Condition(
     context => (context.SourceType.IsClass && !context.IsSourceValueNull) 
      || (context.SourceType.IsValueType 
       && !context.SourceValue.Equals(Activator.CreateInstance(context.SourceType)) 
       ))); 

Die vollständige Lösung ist:

public class Src 
{ 
    public int V1 { get; set; } 
    public int V2 { get; set; } 
    public CustomClass R1 { get; set; } 
    public CustomClass R2 { get; set; } 
} 

public class Dest 
{ 
    public int V1 { get; set; } 
    public int V2 { get; set; } 
    public CustomClass R1 { get; set; } 
    public CustomClass R2 { get; set; } 
} 

public class CustomClass 
{ 
    public CustomClass(string id) { Id = id; } 

    public string Id { get; set; } 
} 

[Test] 
public void IgnorePropertiesWithDefaultValue_Test() 
{ 
    Mapper.CreateMap<Src, Dest>() 
     .ForAllMembers(opt => opt.Condition(
      context => (context.SourceType.IsClass && !context.IsSourceValueNull) 
       || (context.SourceType.IsValueType 
        && !context.SourceValue.Equals(Activator.CreateInstance(context.SourceType)) 
        ))); 

    var src = new Src(); 
    src.V2 = 42; 
    src.R2 = new CustomClass("src obj"); 

    var dest = new Dest(); 
    dest.V1 = 1; 
    dest.R1 = new CustomClass("dest obj"); 

    Mapper.Map(src, dest); 

    //not mapped because of null/default value in src 
    Assert.AreEqual(1, dest.V1); 
    Assert.AreEqual("dest obj", dest.R1.Id); 

    //mapped 
    Assert.AreEqual(42, dest.V2); 
    Assert.AreEqual("src obj", dest.R2.Id); 
}