Q:AutoMapper无法在目标位置使用TypeCode

问题描述 投票:0回答:2

当我添加一个名为[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
        });
    }
}
c# automapper
2个回答
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

0
投票

根据Lucian的回答,我如下更改我的代码,效果很好

var configuration = new MapperConfiguration(c =>
    {
        c.CreateMap<Source, Destination>()
            .ForMember(d => d.IdTypeCode, opt => opt.Ignore());
    });
© www.soinside.com 2019 - 2024. All rights reserved.