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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Pytorch框架之tensor型別轉換(type, type_as)PyTorch框架型別
- Mybatis使用小技巧-自定義型別轉換器MyBatis型別
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- 第11章 使用類——型別轉換(二)將自定義型別轉換為內建型別型別
- Spring Boot之自定義JSON轉換器Spring BootJSON
- 自定義值轉換器
- Operators和 自定義控制器(Custom Controllers)的區別Controller
- Django(6)自定義路由轉換器Django路由
- 自定義型別型別
- 強制型別轉換之(==)型別
- SpringMVC(二)處理器方法繫結形參(簡單型別和註解@RequestParam,pojo型別)、自定義型別轉換器、springMVC亂碼解決SpringMVC型別POJO
- Javascrip 之 字串處理 & 定時器 & 型別轉換Java字串定時器型別
- springmvc 自定義訊息轉換器完整例子SpringMVC
- 【譯】你不知道的 Chrome 除錯工具技巧 第十天:custom formatters(自定義格式轉換器)Chrome除錯ORM
- 型別轉換型別
- 自定義資料型別資料型別
- 型別自定義格式字串型別字串
- 【C++】C++之型別轉換C++型別
- 《Haskell趣學指南》筆記之自定義型別Haskell筆記型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- Mybatis實踐(一)型別轉換器MyBatis型別
- WPF 型別轉換器的實現型別
- 自學java筆記I 基本型別+轉義字元+資料型別的轉換Java筆記字元資料型別
- 資料型別,型別轉換資料型別
- Jaskson精講第6篇-自定義JsonSerialize與Deserialize實現資料型別轉換JSON資料型別
- js型別轉換JS型別
- 型別轉換(cast)型別AST
- Convert型別轉換型別
- Map和String型別之間的轉換型別
- 013 Rust死靈書之型別轉換Rust型別
- [Java基礎]之 資料型別轉換Java資料型別
- ros|自定義訊息型別ROS型別
- DM自定義資料型別資料型別
- 沒有學不會的C++:使用者自定義的隱式型別轉換C++型別
- c#自定義型別的轉換方式operator,以及implicit(隱式)和explicit (顯示)宣告C#型別
- 使用ADD_CUSTOM_COMMAND 新增自定義命令
- 【Flask】路由裝飾器、路徑傳參、自定義路由轉換器Flask路由
- Javascript基礎之-強制型別轉換(三)JavaScript型別