Automapper: actualice los valores de propiedad sin crear un nuevo objeto

260

¿Cómo puedo usar automapper para actualizar los valores de propiedades de otro objeto sin crear uno nuevo?

ryudice
fuente

Respuestas:

456

Use la sobrecarga que toma el destino existente:

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

Sí, devuelve el objeto de destino, pero eso es solo para otros escenarios oscuros. Es el mismo objeto.

Jimmy Bogard
fuente
28
Gracias, Jimmy ... A propósito me mantuve alejado de AutoMapper porque tenía miedo de que la curva de aprendizaje afectara mi horario. Oficialmente siento haberme alejado tanto tiempo ... es mucho más fácil de lo que inicialmente pensé.
Neil T.
13
Automapper tiene que ser una de las bibliotecas más útiles que existen. Yo también lo evité durante mucho tiempo, demasiado tiempo. Empecé a usarlo hoy y estoy muy sorprendido de lo fácil que es usarlo.
mcottingham
44
No funciona para mi. Intento asignar al mismo tipo, pero devuelve un nuevo objeto. Usuario u1, u3 = nuevo Usuario (); u1 = nuevo usuario {Id = 1, NickName = "vami"}; Usuario u4 = Mapper.Map (u1, u3); Assert.AreEqual (u1.Id, u3.Id); Assert.AreEqual (u1.NickName, u3.NickName);
Péter
77
Para su información, descubrí que no necesita especificar los parámetros de tipo. Simplemente, Mapper.Map (origen, destino) funcionará. Agradable y simple!
Judá Gabriel Himango
2
¿Ha cambiado el comportamiento NULL en la versión 4.2.1? Estoy viendo que el mapeo nulo en un objeto devuelve nulo; mientras que en 2.2.1, la asignación nula en un objeto existente devolvió el objeto existente.
Peter McEvoy
18

Para que esto funcione, debe crear CreateMap para los tipos de origen y destino, incluso si son del mismo tipo. Eso significa que si quieres, Mapper.Map<User, User>(user1, user2); necesitas crear un mapa como este Mapper.Create<User, User>()

Flux Xu
fuente
1
¡Decir ah! Acabo de encontrar lo mismo y agregué un comentario a la respuesta aceptada. En mi humilde opinión la respuesta aceptada sin su explicación no es completa, pero después de mi comentario que pueda ser, finalmente :)
Andrzej Martyna
Esta es una gran adición. Sin embargo, la pregunta original no mencionaba los tipos de origen y destino, y no requería que fueran del mismo tipo.
jpaugh
4

Si desea utilizar un método de instancia de IMapper, en lugar del método estático utilizado en la respuesta aceptada, puede hacer lo siguiente (probado 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);

destahora se actualizará con todos los valores de propiedad srcque compartió. Los valores de sus propiedades únicas seguirán siendo los mismos.

Aquí está el código fuente relevante

BobbyA
fuente