AutoMapper usando el constructor incorrecto

Hoy actualicé una aplicación que funciona completamente con AutoMapper v1.1 para usar AutoMapper v2.1 y me encuentro con algunos problemas que nunca encontré con la versión anterior.

Este es un ejemplo de mi asignación de código de Dto a objeto de dominio

public class TypeOne { public TypeOne() { } public TypeOne(TypeTwo two) { //throw ex if two is null } public TypeOne(TypeTwo two, TypeThree three) { //throw ex if two or three are null } public TypeTwo Two {get; private set;} public TypeThree Three {get; private set;} } public class TypeOneDto { public TypeOneDto() { } public TypeTwoDto Two {get; set;} public TypeThreeDto Three {get; set;} } 

 Mapper.CreateMap(); Mapper.CreateMap(); Mapper.CreateMap(); var typeOne = Mapper.Map(typeOneDto); 

Sin embargo, el primer problema que encontré con v2.1 fue que AutoMapper intentaba usar el constructor con 2 argumentos cuando uno de los argumentos era nulo y debería usar el constructor 1 argumento.

Entonces traté de usar

 Mapper.CreateMap().ConstructUsing(x => new TypeOne()); 

Pero seguí recibiendo un error de ‘Invocación ambigua’ que no pude resolver.

Entonces intenté

 Mapper.CreateMap().ConvertUsing(x => new TypeOne()); 

y eso creó con éxito el objeto TypeOne usando el constructor sin parámetros, pero luego falló al establecer las propiedades del establecedor privado.

Busqué ayuda en el sitio web de AutoMapper y descargué el código fuente para verlo bien, pero no llegué muy lejos con la poca documentación y no hubo muchas pruebas unitarias para la construcción.

¿Hay algo obvio que me esté perdiendo y que debería cambiar con v2.1? Me sorprende que haya cambiado tanto desde v1.1.

Solo necesitas agregar un reparto explícito a

 Func 

Aquí está el código:

 Mapper.CreateMap().ConstructUsing( (Func) (r => new TypeOne())); 

La versión actual de AutoMapper funciona como se describe a continuación:

  1. Ordena los constructores de tipo de destino por conteo de parámetros

     destTypeInfo.GetConstructors().OrderByDescending(ci => ci.GetParameters().Length); 
  2. Toma al primer constructor los parámetros que coinciden con las propiedades de origen (sin ninguna comprobación de valor nulo). En su caso es constructor con dos parámetros.