c# - 使用 AutoMapper 进行映射后,如何不丢失目标对象中存在但源对象中不存在的属性

标签 c# .net automapper

我有以下类结构:

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 而不是使用现有的。这将为所有属性使用默认值,对于 boolfalse

我们如何解决这个问题?

首先,我们需要告诉 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/

相关文章:

c# - 是否可以禁用 OpenFileDialog 取消按钮?

c# - 从 JsonContract 中读取 JSON 属性名称

c# - .Net 4.0 框架和 4.5 框架之间的区别?

asp.net - Automapper ninject 依赖项

asp.net-mvc - MVC ViewModel View 之间的最佳实践

c# - 将 AutoMapper 与 Xamarin Sqlite 一起使用时未找到 ToList 方法

c# - EPPlus 的通用 Excel 生成器函数

c# - 错误的参数 c# mvc 4

c# - 闭包语法错误 F#

c# - 使用反射设置嵌套属性值