Estoy usando Automapper en un proyecto y necesito dinámicamente valorizar un campo de mi objeto de destino.

En mi configuración tengo algo similar:

cfg.CreateMap<Message, MessageDto>()
    //...
    .ForMember(dest => dest.Timestamp, opt => opt.MapFrom(src => src.SentTime.AddMinutes(someValue)))
    //...
    ;

La someValue en el código de configuración es un parámetro que necesito para pasar en tiempo de ejecución para el mapper y no es un campo del objeto de origen.

Hay una manera de lograr esto? Algo como esto:

Mapper.Map<MessageDto>(msg, someValue));
Esto podría ayudar a: stackoverflow.com/questions/31748671/…
La parte superior de marcas para el uso adecuado de valorización.

OriginalEl autor davioooh | 2015-12-21

2 Comentarios

  1. 38

    Usted no puede hacer exactamente lo que usted desea, pero usted puede conseguir bastante de cerca por la especificación de las opciones de asignación cuando se llama Mapa. Ignorar la propiedad en su configuración:

    cfg.CreateMap<Message, MessageDto>()
        .ForMember(dest => dest.Timestamp, opt => opt.Ignore())
        ;

    A continuación, pasar opciones cuando usted llame a su mapa:

    int someValue = 5;
    var dto = Mapper.Map<Message, MessageDto>(message, opt => 
        opt.AfterMap((src, dest) => dest.TimeStamp = src.SendTime.AddMinutes(someValue)));

    Tenga en cuenta que usted necesita para utilizar el Mapper.Map<TSrc, TDest> sobrecarga de uso de esta sintaxis.

    Perfecto, esto es exactamente lo que necesito! Gracias!
    ¿no sería más fácil en este caso en lugar de AfterMap simplemente asignar dto.TimeStamp = mensaje.SendTime.AddMinutes(someValue);
    Esta solución sólo funciona para los planos de las asignaciones como si asigna un árbol de objetos que no puedes gestionar esto de forma manual como este…junto con tener el «opt.AfterMap» código multiplica por la cantidad de tiempo que se asigna el objeto en su proyecto y es más difícil de manejar y solucionar en un lugar a menos que usted encapsular toda su función de mapa.
    hermoso, gracias
    Que es más fácil para un uso del tiempo; pero, si usted planea utilizar su asignación en más de un punto, entonces usted tendrá que escribir el código cada vez. Esta solución pasa cada vez que haces Mapper.Map<TSrc, TDest>

    OriginalEl autor Richard

  2. 7

    Otra posible opción, mientras que utilizando el método de asignación sería el uso de los Elementos del diccionario. Ejemplo:

    int someValue = 5;
    var dto = Mapper.Map<Message>(message, 
        opts => opts.Items["Timestamp"] = message.SentTime.AddMinutes(someValue));

    Es un poco menos código, y tiene la ventaja de forma dinámica los campos especificados.

    Esto no funciona con la última versión
    Este enlace codebuckets.com/2016/09/24/passing-parameters-with-automapper tiene una mejor solución para el uso de los Elementos de

    OriginalEl autor Sven

Dejar respuesta

Please enter your comment!
Please enter your name here