自动映射器:在不创建新对象的情况下更新属性值


260

如何在不创建新对象的情况下使用自动映射器更新另一个对象的属性值?

Answers:


456

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

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

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


28
谢谢,吉米...我故意远离AutoMapper,因为我担心学习曲线会影响我的日程安排。抱歉,我离开了这么长时间,这比我最初想象的要容易得多。
尼尔T.

13
Automapper必须是其中最有用的库之一。我也避免了很长时间,太久了。我今天开始使用它,对它的易用性感到非常惊讶。
麦考廷汉姆

4
不适合我。我尝试映射到相同的类型,但它返回新对象。用户u1,u3 =新的User();u1 =新用户{ID = 1,NickName =“ vami”}; 用户u4 = Mapper.Map(u1,u3); Assert.AreEqual(u1.Id,u3.Id); Assert.AreEqual(u1.NickName,u3.NickName);
佩特

7
仅供参考,我发现您不需要指定类型参数。只需Mapper.Map(源,目标)即可。漂亮又简单!
Judah Gabriel Himango 2015年

2
在4.2.1版中是否更改了NULL行为?我看到将null映射到对象将返回null。而在2.2.1中,将null映射到现有对象将返回现有对象。
Peter McEvoy

18

为此,您必须为源和目标的类型创建CreateMap,即使它们是同一类型。这意味着如果您要 Mapper.Map<User, User>(user1, user2); 创建这样的地图 Mapper.Create<User, User>()


1
哈!我刚刚发现了相同内容,并在接受的答案中添加了评论。恕我直言,没有您的解释,被接受的答案还不完整,但经过我的评论,最终可能是:)
Andrzej Martyna 17-10-25

这是一个很棒的补充。但是,原始问题没有提及源和目标的类型,并且不要求它们是同一类型。
jpaugh

4

如果您希望使用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其共享的所有属性值进行更新。其唯一属性的值将保持不变。

这是相关的源代码

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.