Automapper генерирует исключение при отображении объекта со скрытыми свойствами разных типов - PullRequest
0 голосов
/ 21 октября 2011

Вот мои занятия:

public class A
{
public int archive {get; set;}
}

public class B : A
{
 public new bool archive {get; set;}
}

public class aDTO
{
public int archive {get; set;}
}

public class bDTO : aDTO
{
 public new bool archive {get; set;}
}

Теперь, когда я пытаюсь использовать AutoMapper для отображения класса bDTO на класс B, возникает исключение. Вот код моего картографа, который я использую.

IEnumerable<bDTO> myBDTOCollection = getCollection;
Mapper.CreateMap<bDTO, B>();
IEnumerable<B> BList = Mapper.Map<IEnumerable<bDTO>, IEnumerable<B>>(myBDTOCollection);

Я не знаю, упускаю ли я что-то простое или есть лучший способ сделать это или что. Любой вклад будет оценен.

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

Итак, после долгих размышлений и борьбы с AutoMapper я обнаружил источник почти каждой проблемы, с которой я столкнулся до сих пор.

Как только ваши объекты начинают усложняться, становится разумным, что при отображении их вы не используете интерфейс для источника и / или назначения.

В некоторых случаях (например, с моим DTO) я все еще мог использовать интерфейс, но для объектов бизнес-логики AutoMapper предпочитал использовать конкретный тип.

На самом деле, когда я создавал карты, я отображал интерфейсы для своих объектов:
Mapper.CreateMap ()

Что исправило мою проблему, когда я сопоставил конкретный тип для бизнес-объекта:
Mapper.CreateMap ()

Это исправило мою проблему и все остальные проблемы, с которыми я до сих пор сталкивался с Auto Mapper.

0 голосов
/ 21 октября 2011

Для начала этот код не будет компилироваться ...

public new archive bool {get; set;}

должно быть ...

public new bool archive {get; set;}

Ваша проблема в том, что у вас неверные аргументы типа для CreateMap... order is Mapper.CreateMap<SourceType, DestinationType>()

Это должно сработать ...

Mapper.CreateMap<bDTO, B>();
IEnumerable<B> BList = Mapper.Map<IEnumerable<bDTO>, IEnumerable<B>>(myBDTOCollection);

В качестве предложения я думаю, что синтаксическое отображение целых коллекций грязное ... Я предпочитаю это ...

IEnumerable<B> BList = myBDTOCollection.ToList().ConvertAll(Mapper.Map<bDTO, B>);

В любом случае все получится, но ... просто предпочтение:)

...