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);
Это простой пример, но я смог заставить его правильно отобразить карту, а не выбросить исключение. Это не лучший код, выполнение этого приведет к тому, что на один и тот же список будут ссылаться два разных списка только для чтения (в зависимости от ваших требований, это может или не может быть хорошо). Надеюсь, это поможет.