es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  ,

Answer

  1. Avatar for 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 especificar Item como el miembro de origen e ignorar el objeto Wrapper.

    cfg.CreateMap<wrapper, destination="">()
        .ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.Item.Field1))
        .ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.Item.Field2));
    

    Esto mapeará los campos del objeto anidado Source a los campos correspondientes en el objeto Destination sin tener que mapear cada campo individualmente.</wrapper,>

Comments are closed.