2015-05-04 2 views
0

У меня есть источник перечисление, которое содержит внутреннее перечисление, IEnumerable <>. Я хочу, чтобы мои источники могли перечислить внутреннее перечисление и сгладить его в моем перечислении адресата. Однако, когда я пытаюсь выполнить следующий код ниже, мне предлагается исключение, в котором указано, что это недопустимое сопоставление.Снимки и карта объектов внутренней коллекции в другую коллекцию

public class DestinationClass 
{ 
    string Name {get; set;} 
} 

public class SourceClass 
{ 
    IEnumerable<SourceInnerClass> InnerCollection {get; set;} 
} 

public class SourceInnerClass 
{ 
    string Name {get; set;} 
} 

// Mapping Configuration 

Mapper.CreateMap<SourceInnerClass, DestinationClass>(); 

Mapper.CreateMap<SourceClass, IEnumerable<DestinationClass>>() 
       .ForMember(dest => dest, 
       opts => opts.MapFrom(source => source.InnerCollection)); 

// Implementation 

IEnumeration<SourceClass> sourceCollection = GetSourceDataEnumeration(); 

var results = Mapper.Map<IEnumeration<DestinationClass>>(sourceCollection); 

Я пробовал много разных вариантов кода выше, и я не могу понять, где я ошибаюсь. Мне либо предлагается, что я не могу сопоставить «родительский уровень» или что сопоставление не существует.

Если бы я отображение вручную, я бы по существу хочу сделать следующее, однако, авто картограф жалуется эта конструкция является недействительной:

var destination = source.InnerCollection.Select(s => new DestinationClass { Name = s.Name } 

Точной ошибка, я получаю,

Дополнительных информация: Пользовательская конфигурация для членов только поддерживается для отдельных членов верхнего уровня по типу.

ответ

1

Мой подход состоял в том, чтобы сохранить перечислимое из определения CreateMap ... сохранить этот тип для одного объекта.

Mapper.CreateMap<SourceInnerClass, DestinationClass>(); 

    var results = sourceCollection.SelectMany(sm=>sm.InnerCollection).Select(s=>Mapper.Map<DestinationClass>(s)); 
+0

Да, это в значительной степени то, что я сделал. Фокус делал SelectMany во внутренней коллекции до вызова mapper. –

+0

Еще одним неясным способом использования SelectMany является sourceCollection.SelectMany (sm => sm.InnerColletion, (ic, s) => Mapper.Map (s)), где 'ic' представляет каждую внутреннюю коллекцию. Он в основном сглаживает SelectMany и Select в один оператор. Обычно для ясности я предпочитаю версию, которую я изначально написал, потому что мне не нужен доступ к коллекции для каждого объекта. – BlackjacketMack

Смежные вопросы