壮心未与年俱老,死去犹能作鬼雄。这篇文章主要讲述AutoMapper中用户自定义转换相关的知识,希望能为你提供帮助。
Custom Type Converters
Sometimes, you need to take complete control over the conversion of one type to another. This is typically when one type looks nothing like the other, a conversion function already exists, and you would like to go from a "looser" type to a stronger type, such as a source type of string to a destination type of Int32.
For example, suppose we have a source type of:
public class Source { public string Value1 { get; set; } public string Value2 { get; set; } public string Value3 { get; set; } }
【AutoMapper中用户自定义转换】
But you would like to map it to:
public class Destination { public int Value1 { get; set; } public DateTime Value2 { get; set; } public Type Value3 { get; set; } }
If we were to try and map these two types as-is, AutoMapper would throw an exception (at map time and configuration-checking time), as AutoMapper does not know about any mapping from string to int, DateTime or Type. To create maps for these types, we must supply a custom type converter, and we have three ways of doing so:
void ConvertUsing(Func< TSource, TDestination> mappingFunction); void ConvertUsing(ITypeConverter< TSource, TDestination> converter); void ConvertUsing< TTypeConverter> () where TTypeConverter : ITypeConverter< TSource, TDestination> ;
The first option is simply any function that takes a source and returns a destination. This works for simple cases, but becomes unwieldy for larger ones. In more difficult cases, we can create a custom ITypeConverter< TSource, TDestination> :
public interface ITypeConverter< TSource, TDestination> { TDestination Convert(TSource source); }
And supply AutoMapper with either an instance of a custom type converter, or simply the type, which AutoMapper will instantiate at run time. The mapping configuration for our above source/destination types then becomes:
[Test] public void Example() { Mapper.CreateMap< string, int> ().ConvertUsing(Convert.ToInt32); Mapper.CreateMap< string, DateTime> ().ConvertUsing(new DateTimeTypeConverter()); Mapper.CreateMap< string, Type> ().ConvertUsing< TypeTypeConverter> (); Mapper.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) { return System.Convert.ToDateTime(source); } }public class TypeTypeConverter : ITypeConverter< string, Type> { public Type Convert(string source) { Type type = Assembly.GetExecutingAssembly().GetType(source); return type; } }
推荐阅读
- install ubuntu on Android mobile phone
- 安卓事件
- App功能测试的7大注意点
- jdk1.8新特性之lambda表达式及在Android Studio中的使用举例
- Android开发中方法数超过65535的简单解决方法
- Android Studio 之 打包生成的 apk 安装包装到手机上闪退
- AndroidStudio中集成使用Kotlin
- AutoMapper指定列名进行映射
- AndroidStudio3.0 下载使用新功能介绍