AutoMapper не работает с ковариантным интерфейсом - PullRequest
0 голосов
/ 09 ноября 2018
using AutoMapper;

namespace MapTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Mapper.Initialize(cfg =>
            {
                cfg.CreateMap<X, Interf<object>>()
                    .ForMember(dest => dest.B, opt => opt.MapFrom(src => src.K))
                    .ForMember(dest => dest.A, opt => opt.Ignore());
            });

            X x = new X { K = 1 };
            Interf<object> instance = new Cl<Y> { A = new Y() };
            Mapper.Map(x, instance);
        }
    }

    class Cl<T> : Interf<T>
    {
        public T A { get; set; }
        public int B { get; set; }
    }

    interface Interf<out T>
    {
        T A { get; }
        int B { get; set; }
    }

    class X
    {
        public int K { get; set; }
    }

    class Y
    {
    }
}

Этот код вызовет исключение на Mapper.Map(x, instance), поскольку AutoMapper, похоже, не может найти карту X -> Interf<object> для сопоставления с объектом Cl<Y>, хотя я даю подсказку, что instance действительно типа Interf<object>. Если я изменю строку CreateMap на:

cfg.CreateMap<X, Interf<Y>>()

больше не падает, потому что может разрешить Cl<Y> в Interf<Y>.

Есть ли способ это исправить?

...