2010-03-07 3 views
6

Я только что начал использовать AutoMapper и до сих пор нашел его очень простым и экономичным.Сопоставление всех свойств типа «X» с помощью AutoMapper

Только одно, о чем я не уверен - как мне сопоставить все свойства данного типа таким же образом?

Это можно сделать с помощью AutoMapper в одном заявлении, используя лямбда, как с обычным отображением?

+2

попробуйте этот http://valueinjecter.codeplex.com/, он был предназначен для отображения всех реквизитов определенного типа на другой в первую очередь – Omu

+1

Спасибо за это @Omu. Почему бы вам не добавить это как ответ? – Jonathan

ответ

5

То, что вы ищете, называется CustomTypeConverter. Они являются глобальными по объему и только нужно настроить один раз.

синтаксис:

Mapper.CreateMap<TSourceProperty,TDestinationProperty>().ConvertUsing(argument); 

, где argument может быть

  1. Реализация ITypeConverter<TSourceProperty,TDestinationProperty>
  2. Func<TSourceProperty,TDestinationProperty>

Джимми Богард есть статья о реализации CustomTypeConverter с при http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/05/automapper-feature-custom-type-converters.aspx.

Дополнительная информация также указана в CustomTypeConverter page of the AutoMapper documentation.

О, и, кстати, (так как я хочу щедрость Ому), вы также можете сделать это с помощью переключение на valueinjecter.

+0

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

+0

Вам нужен только один вызов 'CreateMap' для экземпляра приложения. Если вам нужно сделать 'int' map to' Foo' по-разному в разных контекстах, тогда вы должны объявить его как сопоставление на основе свойств, а не на основе типа. В этих случаях вы можете использовать [Custom Value Resolvers] (http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers&referringTitle=Home), чтобы указать сложные сопоставления 'int'' Foo' и просто сделать объявление «Mapper.CreateMap (). ForMember (dest => dest.Total, opt => opt.ResolveUsing ());' – smartcaveman

+0

@Omu, чтобы отобразить все типы, наследующие определенные базовый класс, вы можете использовать отражение, чтобы получить все производные типы, а затем пропустить их и вызвать 'CreateMap'. Это может быть дорогостоящим и, вероятно, должно быть выполнено в конфигурации IoC, но статический вызов будет выглядеть примерно так: void MapSubTypes () {foreach (var subType в AppDomain.CurrentDomain.GetAssemblies(). SelectMany (a = > a.GetTypes(). Где (t => typeof (TBase) .IsAssignableFrom (t)))) {Mapper.CreateMap (subType, typeof (TDestination));} '. Простите меня, если я сделал синтаксическую ошибку - ее трудно закодировать в поле комментариев – smartcaveman

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