Automapper — Проблема сопоставления класса со свойством, наследуемым от IEnumerable

#c# #automapper

Вопрос:

Мне нужно сопоставить класс SurveySource с классом SurveyDestination, я получаю это сообщение об исключении

Исключение InvalidCastException: Невозможно привести объект типа «Система».Коллекции.Общий список`1[Лаборатория.ISourceEntity] Лаборатория «для ввода».Коллекция ISourceCollection».

https://github.com/abmptit/TestAutomapper

Мой исходный класс :

     public interface ISourceCollection : IEnumerable<ISourceEntity>
    {
        string Name { get; set; }

        int Count();
    }

    public interface ISourceEntity
    {
        string Name { get; set; }
        string Value { get; set; }
    }

    public class SourceCollection : ISourceCollection
    {
        public string Name { get; set; }

        public int Count()
        {
            return 0;
        }

        public IEnumerator<ISourceEntity> GetEnumerator()
        {
            return (IEnumerator<ISourceEntity>)this;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return (IEnumerator)this;
        }
    }

    public interface ISourceSurvey
    {
        ISourceCollection Collection { get; set; }
    }

    public class SourceSurvey : ISourceSurvey
    {
        public ISourceCollection Collection { get; set; }
    }
 

Мой класс назначения :

         public interface IDestinationCollection : IEnumerable<IDestinationEntity>
    {
        string Name { get; set; }

        int Count();
    }


    public interface IDestinationEntity
    {
        string Name { get; set; }
        string Value { get; set; }
    }

    public class DestinationCollection : IDestinationCollection
    {
        public string Name { get; set; }

        public int Count()
        {
            return 0;
        }

        public IEnumerator<IDestinationEntity> GetEnumerator()
        {
            return (IEnumerator<IDestinationEntity>)this;
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return (IEnumerator)this;
        }
    }

    public interface IDestinationSurvey
    {
        ISourceCollection Collection { get; set; }
    }

    public class DestinationSurvey : IDestinationSurvey
    {
        public ISourceCollection Collection { get; set; }
    }
 

Моя основная программа для mapp source => dest

 class Program
    {
        static void Main(string[] args)
        {
            var config = new MapperConfiguration(
                cfg =>
                {
                    cfg.CreateMap<ISourceCollection, DestinationCollection>();
                    cfg.CreateMap<SourceSurvey, DestinationSurvey>()
                          .ForMember(m => m.Collection, act => act.MapFrom(src => src.Collection));
                });

            var mapper = config.CreateMapper();

            dynamic dynamicSurvey = new ExpandoObject();
            var sourceSurvey = mapper.Map<SourceSurvey>(dynamicSurvey);

            var destinationSurvey = mapper.Map<DestinationSurvey>(sourceSurvey);

            Console.ReadKey();
        }
    }
 

Комментарии:

1. Вы знаете, что ваша IEnumerable реализация в SourceCollection не имеет никакого смысла ? Вы не можете привести SourceCollection к IEnumerator<ISourceEntity> , так как он этого не реализует (и именно поэтому вы получаете InvalidCastException ) … та же история с DestinationCollection

2. общедоступный класс DestinationSurvey : IDestinationSurvey { общедоступная коллекция IDestinationCollection { get; set; } }

3. Почему у него 1 ? Очевидно, что он должен написать правильную реализацию IEnumerable<T> (или производную от класса, который уже это делает) … Класс приведения, который не реализует данный интерфейс, очевидно, закончится InvalidCastException — это очевидно

4. Мне нужно сопоставить SourceSurvey => DestinationSurvey

5. когда мы заменяем в DestinationSurvey/ IDestinationSurvey, IDestinationCollection на IEnumerable<ISourceEntity>, это работает, но нам абсолютно необходимо использовать IDestinationCollection.