2016-07-25 10 views
1

Mapping open generics ist in Automapper möglich, aber ich habe ein Problem bekommen, versuchen, es mit benutzerdefinierten Typ Konverter zu kombinieren.Automapper benutzerdefinierte Konverter für offene generische

Die folgende

cfg.CreateMap(typeof(IEnumerable<>), typeof(MyCustomCollectionType<>)) 
.ConvertUsing(typeof(MyConverter)); 

mit MyConverter wie folgt aussehen:

class MyConverter : ITypeConverter<object, object> 
{ 
    public object Convert(object source, object destination, ResolutionContext context) 
    { 
     //... do conversion 
    } 
} 

nicht nur eine Ausnahme aus, wenn die Abbildung erstellt:

'System.InvalidOperationException' in mscorlib .dll

Weitere Informationen: Diese Operation ist nur für generische Typen gültig.

Wie kann ich einen benutzerdefinierten Typkonverter für offene generische Typen definieren? Welche Schnittstelle muss ich implementieren?

+0

Aktualisieren Sie die Abbildung, wie unten und überprüfen, 'cfg.CreateMap () ConvertUsing (neu MyConverter());' – Thennarasan

+0

Dann dieser Konverter treten in wird. über alles, was nicht meine Absicht ist. Bei der Initialisierung wird _Expression vom Typ 'System.Object' ausgelöst und kann nicht für die Zuweisung von 'System.Double'_ verwendet werden. – Sjoerd222888

Antwort

4

Konverter für offene Generika müssen generische Typen sein. Es wäre in etwa so aussehen:

public class MyConverter<TSource, TDest> 
    : ITypeConverter<IEnumerable<TSource>, MyCustomCollectionType<TDest>> { 
    public MyCustomCollectionType<TDest> Convert(
     IEnumerable<TSource> source, 
     MyCustomCollectionType<TDest> dest, 
     ResolutionContext context) { 
     // you now have the known types of TSource and TDest 
     // you're probably creating the dest collection 
     dest = dest ?? new MyCustomCollectionType<TDest>(); 
     // You're probably mapping the contents 
     foreach (var sourceItem in source) { 
      dest.Add(context.Mapper.Map<TSource, TDest>(sourceItem)); 
     } 
     //then returning that collection 
     return dest; 
    } 
} 
+0

Ich habe das versucht und kann es überhaupt nicht funktionieren. Ich bekomme immer eine Ausnahme mit dem Hinweis "Kann nicht Objekt des Typs 'RestDataConverter'2 [System.Collections.Generic.List'1 [DocumentRecord], System.Collections.Generic.List'1 [TDocument]]" um AutoMapper eingeben. ITypeConverter '2 [RestData'1 [System.Collections.Generic.List'1 [DocumentRecord]], RestData'1 [System.Collections.Generic.List'1 [Dokument]]] '. " – Ristogod