09.AutoMapper 之自定義型別轉換器(Custom Type
自定義型別轉換器(Custom Type Converters)
有時需要完全控制一種型別到另一種型別的轉換。這一般發生在兩種型別不同,已經存在轉換函式,並且希望從弱型別轉變為強型別,如源型別的字串到目標型別Int32。
例如,假設我們的源型別為:
public class Source{ public string Value1 { get; set; } public string Value2 { get; set; } public string Value3 { get; set; } }
你又想對映到以下目標型別:
public class Destination{ public int Value1 { get; set; } public DateTime Value2 { get; set; } public Type Value3 { get; set; } }
如果我們嘗試直接對映這兩種型別, AutoMapper
將丟擲一個異常 (在執行對映時和配置檢查時), 因為AutoMapper
不知道從string
到int
,DateTime
或Type
的該如何對映。 要為這些型別建立對映,我們必須提供自定義型別轉換器,我們有以下三種方法:
void ConvertUsing(Func<TSource, TDestination> mappingFunction);void ConvertUsing(ITypeConverter<TSource, TDestination> converter);void ConvertUsing<TTypeConverter>() where TTypeConverter : ITypeConverter<TSource, TDestination>;
第一種方法是寫一個委託來指定如何轉換源型別到目標型別。如
cfg.CreateMap<string,int>().ConvertUsing(s=>Convert.ToInt32(s));
這種方法只能處理簡單型別的情況,針對複合型別的情況我們需要建立自定義的ITypeConverter<TSource, TDestination>
轉換器:
public interface ITypeConverter<in TSource, TDestination>{ TDestination Convert(TSource source, TDestination destination, ResolutionContext context); }
為AutoMapper
提供自定義型別轉換器的例項,或者只提供型別,AutoMapper
將在執行時例項化。然後,上面的源/目標型別的對映配置變為:
[Test]public void Example(){ Mapper.Initialize(cfg => { cfg.CreateMap<string, int>().ConvertUsing(s => Convert.ToInt32(s)); cfg.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter()); cfg.CreateMap<string, Type>().ConvertUsing<TypeTypeConverter>(); cfg.CreateMap<Source, Destination>(); }); Mapper.AssertConfigurationIsValid(); var source = new Source { Value1 = "5", Value2 = "01/01/2000", Value3 = "AutoMapperSamples.GlobalTypeConverters.GlobalTypeConverters+Destination" }; Destination result = Mapper.Map<Source, Destination>(source); result.Value3.ShouldEqual(typeof(Destination)); }public class DateTimeTypeConverter : ITypeConverter<string, DateTime> { public DateTime Convert(string source, DateTime destination, ResolutionContext context) { return System.Convert.ToDateTime(source); } }public class TypeTypeConverter : ITypeConverter<string, Type> { public Type Convert(string source, Type destination, ResolutionContext context) { return Assembly.GetExecutingAssembly().GetType(source); } }
在第一個對映中,從string到Int32,我們只使用內建的Convert.ToInt32函式。
接下來的兩個對映使用了自定義ITypeConverter實現。
自定義型別轉換器的真正強大的地方在於,AutoMapper
可以在任何源/目標型別上使用它們。我們可以在使用其他對映配置上方構建一組自定義型別轉換器,而無需任何額外配置。在上面的例子中,我們永遠不需要再次指定string/int 轉換。如果必須在型別成員級別配置自定義值解析器,則自定義型別轉換器的範圍是全域性的。
系統型別轉換器
.NETFramework
透過TypeConverter
類支援型別轉換器的概念。AutoMapper
在配置檢查和對映時支援這些型別的型別轉換器,而且不需要手動配置。AutoMappe
透過使用TypeDescriptor.GetConverter
方法確定源/目標型別是否可對映。
作者:這個使用者有點逗
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4692/viewspace-2820161/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mybatis使用小技巧-自定義型別轉換器MyBatis型別
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- Pytorch框架之tensor型別轉換(type, type_as)PyTorch框架型別
- PostgreSQL自定義自動型別轉換(CAST)SQL型別AST
- 第11章 使用類——型別轉換(二)將自定義型別轉換為內建型別型別
- ORACLE 自定義型別[轉]Oracle型別
- 自定義值轉換器
- Spring Boot之自定義JSON轉換器Spring BootJSON
- 自定義型別型別
- Django(6)自定義路由轉換器Django路由
- struts 型別轉換器型別
- Operators和 自定義控制器(Custom Controllers)的區別Controller
- JS直譯器之自動型別轉換:[]==![]JS型別
- JavaRetrofit2使用–自定義轉換器Java
- Native Query的自定義轉換器
- 強制型別轉換之(==)型別
- Javascrip 之 字串處理 & 定時器 & 型別轉換Java字串定時器型別
- 型別自定義格式字串型別字串
- 自定義資料型別資料型別
- Pl/SQL 自定義型別SQL型別
- SpringMVC(二)處理器方法繫結形參(簡單型別和註解@RequestParam,pojo型別)、自定義型別轉換器、springMVC亂碼解決SpringMVC型別POJO
- PHP 型別轉換&&型別強制轉換PHP型別
- 《Haskell趣學指南》筆記之自定義型別Haskell筆記型別
- Hadoop-MapReduce之自定義資料型別Hadoop資料型別
- java型別轉換與強制型別轉換(轉)Java型別
- android自定義Application全域性變數不能型別轉換的問題AndroidAPP變數型別
- springmvc 自定義訊息轉換器完整例子SpringMVC
- python之 資料型別判定與型別轉換Python資料型別
- 型別轉換型別
- 自學java筆記I 基本型別+轉義字元+資料型別的轉換Java筆記字元資料型別
- DM自定義資料型別資料型別
- UnrealEngine建立自定義資產型別Unreal型別
- Linq to sql 自定義型別SQL型別
- ros|自定義訊息型別ROS型別
- 【C++】C++之型別轉換C++型別
- 【譯】你不知道的 Chrome 除錯工具技巧 第十天:custom formatters(自定義格式轉換器)Chrome除錯ORM
- Mybatis實踐(一)型別轉換器MyBatis型別
- WPF 型別轉換器的實現型別