当我添加一个名为[IdTypeCode]的属性(带有十进制类型)时,我遇到了一个非常奇怪的问题目标位置,Map方法将引发异常。有人知道如何解决吗?谢谢。
public class Source
{
public int Id { get; set; }
}
public class Destination
{
public int Id { get; set; }
public decimal? 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
});
}
}
[我相信这是AutoMapper试图将源flatten属性“ Id
”插入目标对象的副作用。
由于目标具有属性IdTypeCode
,因此AutoMapper会尝试从源中查找匹配的值。在这种情况下,似乎在Type.GetTypeCode()
属性上使用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
根据Lucian的回答,我如下更改我的代码,效果很好
var configuration = new MapperConfiguration(c =>
{
c.CreateMap<Source, Destination>()
.ForMember(d => d.IdTypeCode, opt => opt.Ignore());
});