Mapear automáticamente a un subobjeto en AutoMapper con registros.
Tengo un objeto de origen y un objeto de destino.
El objeto de origen está anidado en un objeto envoltorio:
record Source(string Field1, string Field2);
record Destination(string Field1, string Field2);
record Wrapper(Source Item);
Entonces, al hacer la asignación, quiero desempaquetar el objeto, ya que no me importa el envoltorio.
¿Es posible crear una asignación que no implique asignar cada campo uno por uno (los campos realmente tienen los mismos nombres)?
Probando y leyendo la documentación, lo que encontré hasta ahora es lo siguiente:
cfg.CreateMap<wrapper, destination="">().IncludeMembers(s => s.Item);
cfg.CreateMap<source, destination="">();
Esto funciona con clases, pero no con registros: arroja el error Destination needs to have a constructor with 0 args or only optional args
.
Creo entender por qué (supongo que las propiedades del objeto anidado tienen el prefijo del nombre del objeto: ItemField1
, ItemField2
, entonces cuando intenta hacer coincidirlos con los nombres de parámetros del constructor, no encuentra ninguna coincidencia).
No estoy seguro si esto debería considerarse un error, o el comportamiento esperado (o un escenario no admitido), pero es bastante frustrante.
Entonces, ¿hay otra forma de hacer esa asignación?</source,></wrapper,>
davy.ai
Sí, hay otra forma de hacer el mapeo sin tener que mapear cada campo uno por uno. Puedes usar el método
ForMember
para especificar los miembros de origen y destino que se van a mapear. En este caso, puedes especificarItem
como el miembro de origen e ignorar el objeto Wrapper.Esto mapeará los campos del objeto anidado
Source
a los campos correspondientes en el objetoDestination
sin tener que mapear cada campo individualmente.</wrapper,>