Я полагаю, что это побочный эффект попытки AutoMapper " свести " исходного свойства Id
к объекту назначения.
Так как у вашего назначения есть свойство IdTypeCode
AutoMapper попытается найти соответствующее значение из источника. И в этом случае он, похоже, использует метод Type.GetTypeCode()
свойства Source.Id
и, следовательно, пытается сопоставить System.TypeCode
с decimal
. Это можно увидеть в исключении, которое выдается:
Destination Member: IdTypeCode
---> AutoMapper.AutoMapperMappingException: Missing type map configuration or unsupported mapping.
Mapping types:
TypeCode -> Decimal
System.TypeCode -> System.Decimal
Это можно проверить, изменив тип Destination.IdTypeCode
на System.TypeCode
:
public class Source
{
public int Id { get; set; }
}
public class Destination
{
public int Id { get; set; }
public TypeCode IdTypeCode { get; set; }
}
class Program
{
static void Main(string[] args)
{
var configuration = new MapperConfiguration(c => c.CreateMap<Source, Destination>());
var mapper = configuration.CreateMapper();
//will throw an exception
var dest = mapper.Map<Destination>(new Source
{
Id = 1
});
Console.WriteLine(dest.IdTypeCode);
}
}
, что приводит к отображению успешно, и Destination.IdTypeCode
сопоставляется со значением Int32
.
С учетом сказанного, кроме изменения имени свойства, одним простым решением является просто игнорировать это свойство в месте назначения:
var configuration = new MapperConfiguration(c =>
{
c.CreateMap<Source, Destination>()
.ForMember(d => d.IdTypeCode, opt => opt.Ignore());
});