Запретить преобразованию Automapper свойства IEnumerable в список - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь сопоставить модель с ViewModel, которая имеет свойства типов, наследуемых от IEnumerable.Свойства имеют тот же тип и имя, но Automapper преобразует источник в общий список, а затем не может отобразить его на место назначения.

Это классы, которые я пытаюсь отобразить:

BasicOverview
{
   public IRichTextContent Intro { get; set; }
   ...
}

BlogOverviewViewModel
{
   public IRichTextContent Intro { get; set; }
   ...
}

Ниже приведен сторонний код, в котором определен тип IRichTextContent:

//     Represents rich text content in a form of structured data
public interface IRichTextContent : IEnumerable<IRichTextBlock>, IEnumerable
{
    //
    // Summary:
    //     List of rich text content blocks
    IEnumerable<IRichTextBlock> Blocks { get; set; }
}

Мой профиль Automapper:

public AutomapperProfile()
    {
        CreateMap<BasicOverview, BlogListViewModel>();
        CreateMap<BasicOverview, ReviewListViewModel>();
        CreateMap<BasicOverview, BlogOverviewViewModel>();
    }

И это ошибка, которую я получаю:

Произошло необработанное исключение при обработке запроса.InvalidCastException: невозможно привести объект типа 'System.Collections.Generic.List`1 [KenticoCloud.Delivery.IRichTextBlock]' к типу KenticoCloud.Delivery.IRichTextContent.lambda_method (Closure, BasicOverview, BlogOverviewViewModel, ResolutionContext)

AutoMapperMappingException: типы сопоставления ошибок.

Типы сопоставления: BasicOverview -> BlogOverviewViewModel

Тип конфигурации карты: BasicOverViewModeView - ViewOverView - ViewOverView> View1021 *

Элемент назначения: Intro lambda_method (Closure, BasicOverview, BlogOverviewViewModel, ResolutionContext)

Я попытался добавить следующее в свой профиль Automapper:

CreateMap<IEnumerable<IRichTextBlock>, IRichTextContent>()
            .ForMember(dest => dest.Blocks, m => m.MapFrom(src => src));

, который произвелследующая ошибка:

TypeLoadException: метод 'GetEnumerator' в типе 'Proxy_KenticoCloud.Delivery.IRichTextContent_12345678_' из сборки 'AutoMapper.Proxies, версия = 0.0.0.0, культура = нейтральная, PublicKeyToken = abc123efесть реализация.

1 Ответ

0 голосов
/ 22 января 2019

Просто чтобы сделать ответ из комментария Lucian Bargaoanu более заметным.

Одно из решений - добавить следующее отображение в профиль Automapper:

CreateMap<IRichTextContent, IRichTextContent>().ConvertUsing(s=>s);
...