2016-07-25 76 views
1

映射open generics是可能的自動映射器,但我已經accros一些問題試圖將它與自定義類型轉換器相結合。自動映射器自定義轉換器開放通用

以下

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

與MyConverter看起來像這樣:

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

不隨便扔,如果映射會創建一個例外:在mscorlib程序

'System.InvalidOperationException' .dll

附加信息:此操作僅對泛型類型有效。

如何爲開放式泛型類型定義自定義類型轉換器?我需要實現什麼接口?

+0

更新如下映射和檢查, 'cfg.CreateMap <對象,對象>()ConvertUsing(新MyConverter());' – Thennarasan

+0

那麼這個轉換器將踢的。關於一切不是我的意圖。在初始化時它會拋出_類型爲'System.Object'的表達式不能用於賦值來鍵入'System.Double'_。 – Sjoerd222888

回答

4

開放式泛型轉換器需要是泛型類型。它看起來是這樣的:

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

我試過這個,不能讓它工作。我總是會收到一個異常,指出「無法投射類型爲'RestDataConverter'2 [System.Collections.Generic.List'1 [DocumentRecord],System.Collections.Generic.List'1 [TDocument]]'的對象來鍵入'AutoMapper。 ITypeConverter'2 [RestData'1 [System.Collections.Generic.List'1 [DocumentRecord]],RestData'1 [System.Collections.Generic.List'1 [Document]]]'。「 – Ristogod