我有以下类结构:
public class A
{
public bool Property1 { get; set; }
public bool Property2 { get; set; }
}
public class ContainerForA
{
public A A { get; set; }
}
public class A1
{
public bool Property1 { get; set; }
}
public class ContainerForA1
{
public A1 A { get; set; }
}
我为这组类创建了一个映射:
Mapper.CreateMap<A1, A>();
Mapper.CreateMap<ContainerForA1, ContainerForA>();
我创建了这组类的实例:
var cnt_a = new ContainerForA()
{
A = new A()
{
Property1 = false,
Property2 = true
}
};
var cnt_a1 = new ContainerForA1()
{
A = new A1()
{
Property1 = true
}
};
如果我致电Mapper.Map(cnt_a1.A, cnt_a.A)
,我会得到我期望的结果:对象 cnt_a 的两个属性(Property1
和Property2
)都是真
但是,如果我致电Mapper.Map(cnt_a1, cnt_a)
我的Property1
为真,Property2
为假。有人能解释我为什么吗?我有没有选择在路上声明我的映射,所以我不会丢失目标对象中存在的属性但不在我的源对象中?
答案 0 :(得分:3)
我猜想当你从ContainerForA1
映射到ContainerForA
时,在映射属性A时会为A
创建ContainerForA
的新实例而不是使用现有的。这将使用所有属性的默认值,false
为bool
。
我们如何解决这个问题?
首先,我们需要告诉AutoMapper不要覆盖ContainerForA上的属性A.为此,我们将告诉AutoMapper忽略该属性。
Mapper.CreateMap<ContainerForA1, ContainerForA>()
.ForMember(cForA => cForA.A, option => option.Ignore());
现在我们需要使用AfterMap手动更新A
Mapper.CreateMap<ContainerForA1, ContainerForA>()
.ForMember(cForA => cForA.A, option => option.Ignore())
.AfterMap((cForA1, cForA) => Mapper.Map(cForA1.A, cForA.A));
您可能希望向AfterMap方法添加一些检查,以确保cForA.A不为null。我会留给你的。