我使用Automapper将对象
source
映射到对象destination
。是否有办法仅将source
对象中非默认值的属性映射到destination
对象中?source
映射到对象destination
。是否有办法仅将source
对象中非默认值的属性映射到destination
对象中?!= null
,对于值类型,!= default
):Mapper.CreateMap<Src, Dest>()
.ForAllMembers(opt => opt.Condition(
context => (context.SourceType.IsClass && !context.IsSourceValueNull)
|| ( context.SourceType.IsValueType
&& !context.SourceValue.Equals(Activator.CreateInstance(context.SourceType))
)));
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);
}