我有以下类结构:
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)
我会得到我期望的结果:两个属性(Property1
和 对象 cnt_a 的 Property2
) 为 true
但是,如果我调用 Mapper.Map(cnt_a1, cnt_a)
,我将得到 Property1
的 true 和 Property2
的 false。有人可以解释一下为什么吗?是否有任何选项可以让我以这种方式声明我的映射,这样我就不会丢失目标对象中存在但源对象中不存在的属性?
最佳答案
我猜测,当您从 ContainerForA1
映射到 ContainerForA
时,映射属性 A 时,它会创建 A
的新实例为 ContainerForA
而不是使用现有的。这将为所有属性使用默认值,对于 bool
为 false
。
我们如何解决这个问题?
首先,我们需要告诉 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。我把它留给你。
关于c# - 使用 AutoMapper 进行映射后,如何不丢失目标对象中存在但源对象中不存在的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11346571/