2010-03-07 19 views
6

Acabo de empezar a utilizar AutoMapper y hasta ahora me pareció muy sencillo y ahorro de tiempo.Asignación de todas las propiedades de tipo 'X' con AutoMapper

Solo una cosa de la que no estoy seguro: ¿cómo puedo mapear todas las propiedades de un tipo determinado de la misma manera?

¿Se puede hacer esto con AutoMapper en una sola instrucción, usando una lambda, como con la asignación normal?

+2

intente este http://valueinjecter.codeplex.com/, fue diseñado para mapear desde todos los accesorios de un tipo específico a otro en primer lugar – Omu

+1

Gracias por eso @Omu. ¿Por qué no agregas eso como una respuesta? – Jonathan

Respuesta

5

Lo que estás buscando se conoce como CustomTypeConverter. Estos son de alcance global, y solo necesitan configurarse una vez.

La sintaxis es la siguiente:

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

donde argument puede haber

  1. Una implementación de ITypeConverter<TSourceProperty,TDestinationProperty>
  2. Un Func<TSourceProperty,TDestinationProperty>

Jimmy Bogard tiene un artículo sobre la implementación de CustomTypeConverter s en http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/05/automapper-feature-custom-type-converters.aspx.

Más información también se proporciona en el CustomTypeConverter page of the AutoMapper documentation.

Ah, y por cierto (ya que quiero la recompensa de Omu) también puede hacer esto por cambiando a valueinjecter.

+0

no es lo mismo, si necesita diferentes algoritmos para convertir de int a Foo para obtener más asignaciones (probablemente tendría que llamar a CreateMap cada vez antes de la asignación), o si necesitaría un mapa de todos los tipos que heredan un cierto clase base a int, ¿cómo harías eso? – Omu

+0

Solo necesitas una sola llamada a 'CreateMap' por instancia de aplicación. Si necesita hacer un mapa 'int' a' Foo' de forma diferente en diferentes contextos, entonces debe declararlo como un mapeo basado en propiedades en lugar de un mapeo basado en tipos. En estos casos, puede usar [Custom Value Resolvers] (http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers&referringTitle=Home) para especificar complicadas asignaciones 'int' a' Foo', y solo haga la declaración 'Mapper.CreateMap (). ForMember (dest => dest.Total, opt => opt.ResolveUsing ());' – smartcaveman

+0

@Omu, para mapear todos los tipos que heredan un cierto clase base, puede usar la reflexión para obtener todos los tipos derivados y luego recorrerlos y llamar a 'CreateMap'. Esto puede ser costoso y probablemente deba hacerse en su configuración de IoC, pero la llamada estática se parecería a 'void MapSubTypes () {foreach (var subType en AppDomain.CurrentDomain.GetAssemblies(). SelectMany (a = > a.GetTypes(). Where (t => typeof (TBase) .IsAssignableFrom (t)))) {Mapper.CreateMap (subtipo, typeof (TDestination));} '. Perdónenme si cometí un error de sintaxis: es difícil codificar en el cuadro de comentarios – smartcaveman

Cuestiones relacionadas