自动映射:更新属性值而不创建新对象

ryu*_*ice 243 .net c# automapper

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

Jim*_*ard 420

使用占用现有目标的重载:

Mapper.Map<Source, Destination>(source, destination);
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,吉米......我故意远离AutoMapper,因为我害怕学习曲线影响我的日程安排.我正式对不起,我离开了这么久......这比我最初想的要容易得多. (25认同)
  • Automapper必须是最有用的库之一.很长一段时间我也避免了这么久.我今天开始使用它,并且非常惊讶于它的易用性. (12认同)
  • 仅供参考,我发现您不需要指定类型参数.简单地说,Mapper.Map(源,目标)将起作用.好又简单! (6认同)
  • 不适合我.我尝试映射到相同的类型,但它返回新对象.用户u1,u3 =新用户(); u1 =新用户{Id = 1,NickName ="vami"}; 用户u4 = Mapper.Map(u1,u3); Assert.AreEqual(u1.Id,u3.Id); Assert.AreEqual(u1.NickName,u3.NickName); (3认同)
  • 在版本4.2.1中是否更改了NULL行为?我看到将null映射到对象返回null; 而在2.2.1中,将null映射到现有对象会返回现有对象. (2认同)
  • @AndrzejMartyna嗯,我试图用`IEnumerable <>`做到这一点,但我只是注意到**自我引用**解决方案仅适用于个别实体.好吧,'foreach`解决了我的情况,但我想知道为什么使用`IEnumerable <>`不起作用. (2认同)

小智 15

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

  • 哈!我刚刚找到了相同的内容,并对已接受的答案添加了评论。恕我直言,没有您的解释,接受的答案并不完整,但在我的评论之后,最终可能是:) (2认同)

Bob*_*byA 7

如果您希望使用 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);
Run Code Online (Sandbox Code Playgroud)

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

这是相关的源代码