2010-03-07 6 views
6

Ich habe gerade angefangen AutoMapper zu verwenden und fand es bisher sehr einfach und zeitsparend.Mapping aller Eigenschaften von "X" -Typ mit AutoMapper

Nur eine Sache, über die ich mir nicht sicher bin: Wie mappe ich alle Eigenschaften eines bestimmten Typs auf die gleiche Weise?

Kann dies mit AutoMapper in einer einzigen Anweisung, mit einem Lambda, wie bei der regulären Zuordnung getan werden?

+2

versuchen Sie diese http://valueinjecter.codeplex.com/, es wurde entwickelt, um von allen Requisiten eines bestimmten Typs zu einem anderen in erster Linie – Omu

+1

Dank dafür @Omu. Warum fügst du das nicht als Antwort hinzu? – Jonathan

Antwort

5

Was Sie suchen, ist bekannt als CustomTypeConverter. Diese sind global angelegt und müssen nur einmal konfiguriert werden.

Die Syntax lautet:

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

wo argument

  1. Eine Implementierung von ITypeConverter<TSourceProperty,TDestinationProperty>
  2. A Func<TSourceProperty,TDestinationProperty>

Jimmy Bogard ein Artikel sein kann, auf der Umsetzung CustomTypeConverter s bei http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/05/05/automapper-feature-custom-type-converters.aspx. Weitere Informationen finden Sie auch in der CustomTypeConverter page of the AutoMapper documentation.

Oh, und übrigens (da ich Omu Bounty wollen) können Sie dies auch tun, indem Sie Wechsel zu ValueInjecter.

+0

Es ist nicht wirklich das gleiche, wenn Sie andere Algorithmen für die Konvertierung von int zu Foo für weitere Zuordnungen benötigen (wahrscheinlich müssten Sie CreateMap jedes Mal vor dem Mapping aufrufen), oder wenn Sie Map von allen Typen benötigen, die eine bestimmte erben Basisklasse zu int, wie würden Sie das tun – Omu

+0

Sie brauchen nur einen einzigen Aufruf von CreateMap pro Anwendungsinstanz. Wenn Sie in verschiedenen Kontexten "int" map zu "Foo" anders machen müssen, sollten Sie es als eine eigenschaftsbasierte Zuordnung anstelle einer typbasierten Zuordnung deklarieren. In diesen Fällen können Sie [Benutzerdefinierte Werte-Resolver] (http://automapper.codeplex.com/wikipage?title=Custom%20Value%20Resolvers&referringTitle=Home) verwenden, um komplizierte 'int'- bis' Foo'-Zuordnungen anzugeben und einfach zu machen die Deklaration "Mapper.CreateMap (). ForMember (dest => Ziel.Total, opt => opt.ResolveUsing ());' – smartcaveman

+0

@Omu, um alle Typen, die ein bestimmtes erben, zuzuordnen Basisklasse, können Sie Reflektion verwenden, um alle abgeleiteten Typen zu erhalten und dann durch sie zu durchlaufen und 'CreateMap' aufzurufen. Dies kann kostspielig sein und sollte wahrscheinlich in Ihrer IoC-Konfiguration durchgeführt werden, aber der statische Aufruf würde etwa wie folgt aussehen: void MapSubTypes () {foreach (var subType in AppDomain.CurrentDomain.GetAssemblies(). SelectMany (a = > a.GetTypes() .Wobei (t => typeof (TBase) .IsAssignableFrom (t)))) {Mapper.CreateMap (subType, typeof (TDestination));} '. Verzeihen Sie mir, wenn ich einen Syntaxfehler gemacht habe - es ist schwer in das Kommentarfeld – smartcaveman

Verwandte Themen