【问题标题】:Automapper: Update property values without creating a new objectAutomapper:更新属性值而不创建新对象
【发布时间】:2011-01-23 09:35:22
【问题描述】:

如何使用 automapper 更新另一个对象的属性值而不创建新对象?

【问题讨论】:

    标签: c# .net automapper


    【解决方案1】:

    使用采用现有目的地的重载:

    Mapper.Map<Source, Destination>(source, destination);
    

    是的,它返回目标对象,但这仅适用于其他一些晦涩的场景。这是同一个对象。

    【讨论】:

    • 谢谢,Jimmy...我故意远离 AutoMapper,因为我担心学习曲线会影响我的日程安排。我很抱歉我离开了这么久......这比我最初想象的要容易得多。
    • Automapper 必须是最有用的库之一。我也躲了很长时间,太久了。我今天开始使用它,对它的易用性感到非常惊讶。
    • 不适合我。我尝试映射到相同的类型,但它返回新对象。用户 u1, u3 = 新用户(); u1 = 新用户 { Id = 1, NickName = "vami" };用户 u4 = Mapper.Map(u1, u3);断言.AreEqual(u1.Id, u3.Id); Assert.AreEqual(u1.NickName, u3.NickName);
    • 仅供参考,我发现您不需要指定类型参数。简单地说, Mapper.Map(source, destination) 将起作用。又好又简单!
    • 4.2.1 版中的 NULL 行为是否发生了变化?我看到将 null 映射到对象会返回 null;而在 2.2.1 中,将 null 映射到现有对象会返回现有对象。
    【解决方案2】:

    要完成这项工作,您必须为源和目标的类型创建地图,即使它们是相同的类型。 这意味着如果你想 Mapper.Map&lt;User, User&gt;(user1, user2); 你需要像这样创建地图 Mapper.Create&lt;User, User&gt;()

    【讨论】:

    • 哈!我刚刚找到了相同的内容,并在已接受的答案中添加了评论。恕我直言,没有你解释的接受的答案是不完整的,但在我的评论之后,它可能是,最后:)
    • 这是一个很好的补充。但是,原问题并没有提到源和目标的类型,也没有要求它们是同一类型。
    • 这也是我的问题。必须创建一个将 A 映射到 A 的配置文件,然后它才能工作。
    【解决方案3】:

    如果您希望使用 IMapper 的实例方法,而不是接受答案中使用的静态方法,您可以执行以下操作(在 AutoMapper 6.2.2 中测试)

    IMapper _mapper;
    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<Source, Destination>();
    });
    _mapper = config.CreateMapper();
    
    Source src = new Source
    {
    //initialize properties
    }
    
    Destination dest = new dest
    {
    //initialize properties
    }
    _mapper.Map(src, dest);
    

    dest 现在将使用它共享的来自src 的所有属性值进行更新。其独特属性的值将保持不变。

    Here's the relevant source code

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 2018-10-25
      • 2019-05-02
      • 2017-12-13
      • 1970-01-01
      相关资源
      最近更新 更多