InvalidCastException при отображении типов MyType в MyType

Я использую AutoMapper 2.2.1 для отображения различных бизнес-объектов для просмотра моделей. Теперь я получаю InvalidCastExceptions если я пытаюсь отобразить объекты, которые имеют свойство типа CustomList (см. код ниже). Исключение говорит о том, что CustomList не может быть приведен к IList, Что правильно, потому что CustomList инвентарь IReadOnlyList и не IList,

Так почему же Autopper пытается привести его таким образом, и как это исправить?

У меня есть эти типы:

public class MyViewModel : SomeModel { //... some addtional stuff ...}

public class SomeModel {
public CustomList DescriptionList { get; internal set; }
}

public class CustomList : ReadOnlyList<SomeOtherModel> {}

public abstract class ReadOnlyList<TModel> : IReadOnlyList<TModel> {}

//map it
//aList is type of SomeModel 
var viewList = Mapper.Map<List<MyViewModel>>(aList);

1 ответ

Реализация вашего класса из IReadOnlyList, скорее всего, вызывает проблему. Automapper не знает, как отобразить список только для чтения в список только для чтения. Он создает новые экземпляры объектов, и для IReadOnlyList отсутствует метод добавления или инициализатор коллекции. Automapper должен иметь возможность доступа к базовому списку, который охватывает только для чтения. Это можно сделать с помощью метода ConstructUsing.

Обновленная модель списка:

public class CustomList : IReadOnlyList<string>
{
    private readonly IList<string> _List;

    public CustomList (IList<string> list)
    {
        _List = list;
    }

    public CustomList ()
    {
        _List = new List<string>();
    }

    public static CustomList CustomListBuilder(CustomList customList)
    {
        return new CustomList (customList._List);
    }
}

Обновлен конфиг автомаппера

Mapper.CreateMap<CustomList, CustomList>().ConstructUsing(CustomList.CustomListBuilder);

Это простой пример, но я смог заставить его правильно отобразить карту, а не выбросить исключение. Это не лучший код, выполнение этого приведет к тому, что на один и тот же список будут ссылаться два разных списка только для чтения (в зависимости от ваших требований, это может или не может быть хорошо). Надеюсь, это поможет.

Другие вопросы по тегам