Q: AutoMapper не может использовать TypeCode в Destination - PullRequest
0 голосов
/ 13 марта 2020

У меня возникла очень странная проблема, когда я добавляю свойство с именем [IdTypeCode] с десятичным типом в Destination, метод 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
        });
    }
}

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Я полагаю, что это побочный эффект попытки 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());
    });
0 голосов
/ 13 марта 2020

согласно ответу Люциана, я изменяю свой код, как показано ниже, он хорошо работает

    public class Source
    {
        public string Card { get; set; }
    }

    public class Destination
    {
        public string Card { get; set; }
        public decimal CardTypeCode { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var configuration = new MapperConfiguration(configure =>
            {
                //set this func
                configure.ShouldMapMethod = _ => false;
                configure.CreateMap<Source, Destination>();
            });
            var mapper = configuration.CreateMapper();
            var dest = mapper.Map<Destination>(new Source
            {
                Card = "1"
            });
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...