2015-10-20 4 views
0

Automapper позволяет определить отображение и ссылаться на него со следующим синтаксисом:Mapping чередовать классы назначения на основе источника

Mapper.CreateMap<Order, OrderDto>(); 
OrderDto dto = Mapper.Map<OrderDto>(order); 

Можно ли указать тип получателя, используя предикат рода?

Mapper.CreateMap<Order, FooType>().Where(s => s["_type"].ToString() == "Foo"); 
Mapper.CreateMap<Order, BarType>().Where(s => s["_type"].ToString() == "Bar"); 

Оба FooType и BarType имеют внутренние свойства, соответствующие значениям отдельных ключей в пределах типов источников внутреннего словаря.

Чтобы правильно отобразить эти значения, я должен быть уверен, что они существуют, что в этом случае определяется значением ключа _type.

Редактировать: Если возможно, будет синтаксис для использования Mapper.Map <>() ;?

+0

Если я дал неправильный ответ, пожалуйста, опишите свойства для отображения в деталях, может быть, я просто не понял вы. –

+0

Предположим, вы могли бы сделать это, как бы выглядел ваш фактический код «Mapper.Map»? Будете ли вы искать карту для объекта или динамического типа или ...? – stuartd

+0

@stuartd Хороший вопрос - я не уверен, что это будет. В моей голове я вижу, что он работает подобно Ninject, в котором вы можете определить x количество отображений для данного типа источника, а затем использовать контекстную привязку для выбора соответствующего типа назначения. При вызове карты с типом источника будет автоматически искать правильный тип адресата на основе предварительно сконфигурированных сопоставлений. Похоже, на странице Automapper Github была поднята проблема, позволяющая использовать дискриминаторы против сопоставлений, но не уверен, что это поможет мне - https://github.com/AutoMapper/AutoMapper/issues/258 –

ответ

0

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

Mapper.CreateMap<Foo,Bar>() 
     .ForMember(dest => dest.baz, opt => opt.Condition(src => (src.baz >= 0))); 

и

Mapper.CreateMap<Source, Target>() 
     .ForMember(dest => dest.Value, 
        opt => opt.MapFrom 
        (src => src.Value1.StartsWith("A") ? src.Value1 : src.Value2)); 
+0

Вопрос заключается в том, как определить тип целевого объекта в зависимости от свойства исходного объекта. – stuartd