2010-03-07 130 views
6

我剛開始使用AutoMapper,並且迄今爲止發現它非常直接且省時。使用AutoMapper映射'X'類型的所有屬性

只是我不確定的一件事 - 我如何以同樣的方式映射給定類型的所有屬性?

這可以通過AutoMapper在單個語句中使用lambda來完成,就像使用常規映射一樣?

+2

嘗試這一個http://valueinjecter.codeplex.com/,它被設計爲從一個特定類型的所有道具映射到另一個在首位 – Omu 2010-09-02 21:16:25

+1

感謝@Omu。你爲什麼不添加這個答案? – Jonathan 2010-09-02 23:13:04

回答

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也提供了更多信息。

哦,順便說一下(因爲我想要Omu的賞金),你也可以通過切換到價值觀投注

+0

這不是真的一樣,如果你需要不同的算法從int轉換到Foo來獲得更多的映射(可能你必須在映射之前每次調用CreateMap),或者如果你需要映射所有繼承某個特定類型的類型基類到int,你會怎麼做 – Omu 2011-03-22 20:51:16

+0

你只需要對每個應用程序實例的'CreateMap'進行一次調用。如果您需要在不同的上下文中將「int」映射爲「Foo」,則應該將其聲明爲基於屬性的映射,而不是基於類型的映射。在這些情況下,您可以使用[自定義值解析器](http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers&referringTitle=Home)將複雜的'int'指定爲'Foo'映射,然後使聲明Mapper.CreateMap ()。ForMember(dest => dest.Total,opt => opt.ResolveUsing ());' – smartcaveman 2011-03-22 22:38:54

+0

@Omu,映射所有繼承某個基類,你可以使用反射來獲得所有派生類型,然後遍歷它們並調用'CreateMap'。這可能是昂貴的,應該可以在你的IoC配置中完成,但靜態調用將看起來像'void MapSubTypes (){foreach(AppDomain.CurrentDomain.GetAssemblies()中的var subType)SelectMany(a = > a.GetTypes()。其中​​(t => typeof(TBase).IsAssignableFrom(t)))){Mapper.CreateMap(subType,typeof(TDestination));}'。原諒我,如果我犯了一個語法錯誤 - 它很難在註釋框 – smartcaveman 2011-03-22 22:47:35

相關問題