AutoMapper(七)
返回总目录
Null值替换
如果源类型的成员链上的属性值为Null,Null值替换允许提供一个可替换的值。下面有两个类Person和PersonInfo类,都有一个属性Title(头衔),从Person映射到PersonInfo,如果Person的属性没有赋值,那么PersonInfo的对应属性值就用“屌丝”来替换。
namespace SeventhAutoMapper { class Person { public string Title { get; set; } } class PersonInfo { public string Title { get; set; } } class Program { static void Main(string[] args) { //映射 Mapper.CreateMap<Person, PersonInfo>() .ForMember(dest => dest.Title, opt => opt.NullSubstitute("屌丝"));//源属性如果为null,置为“屌丝” //执行映射 var personInfo = Mapper.Map<PersonInfo>(new Person());//源属性未赋值,故为null var personInfo2 = Mapper.Map<PersonInfo>(new Person(){Title = "高富帅"});//源属性有值 //输出结果 Console.WriteLine("personInfo.Title=" + personInfo.Title); Console.WriteLine("personInfo2.Title=" + personInfo2.Title); Console.Read(); } } }
测试结果如下:
开放泛型
AutoMapper支持开放泛型映射。下面创建两个泛型类:
class Soure<T> { public T Value { get; set; } } class Destination<T> { public T Value { get; set; } }
我们不需要创建封闭的泛型类型(也就是不将具体的类型写死在尖括号内),AutoMapper在运行时会将开放泛型的任何配置应用到关闭的映射上去。
//创建开放泛型的映射 Mapper.CreateMap(typeof(Source<>),typeof(Destination<>)); var src1 = new Source<int> {Value = 22}; var dest1= Mapper.Map<Destination<int>>(src1); Console.WriteLine(dest1.Value); var src2 = new Source<string> {Value = "Hello,AutoMapper!"}; var dest2 = Mapper.Map<Destination<string>>(src2); Console.WriteLine(dest2.Value); //......依次类推 Console.Read();
测试结果如下:
因为C#只允许关闭的泛型形参,所以必须使用不带泛型参数的CreateMap方法来创建自己的开放泛型参数映射,同时可以使用所有可以利用的映射配置。AutoMapper在配置验证期间会跳过开放泛型类型映射。
也可以创建一个开放泛型转换器:
Mapper.CreateMap(typeof(Source<>), typeof(Destination<>)).ConvertUsing(typeof(Converter<>));
投影
通过扁平化对象模型,将一个源类型转换成一个目标类型。不需要额外的配置,AutoMapper只要求一个扁平的目标类型能匹配源类型的命名结构。当把一个源值投影到一个不精准匹配源结构的目标值时,必须指明成员映射定义。
举个栗子,我们想把一个源结构CalendarEvent转成一个在Web页面上方便用户输入的目标结构CalendarEventForm:
public class CalendarEvent { public DateTime Date { get; set; } public string Title { get; set; } } public class CalendarEventForm { public DateTime EventDate { get; set; } public int EventHour { get; set; } public int EventMinute { get; set; } public string Title { get; set; } }
由于目标属性不是很匹配源属性(CalendarEvent.Date需要成为CalendarEventForm.EventDate),我们需要在类型映射配置中指明成员的映射规则:
var calender = new CalendarEvent() { Date = DateTime.Now, Title = "历史性时刻" }; //创建映射 Mapper.CreateMap<CalendarEvent, CalendarEventForm>() .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date)) .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour)) .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute)); //执行映射 var calenderForm = Mapper.Map<CalendarEventForm>(calender); //输出映射前的对象 Console.WriteLine("calender.Date={0},Title={1}",calender.Date,calender.Title); //输出映射后的对象 foreach (PropertyInfo info in calenderForm.GetType().GetProperties()) { Console.WriteLine(info.Name+"="+info.GetValue(calenderForm)); }
测试结果如下:
好的,关于AutoMapper的系列教程就先告一段落了,当时开这系列教程的初衷是为了顺利地进行项目地开发,现在会用了,关于AutoMapper的话题就暂时先放放,不过以后肯定还会有关于AutoMapper的博客的。
如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击右下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!
作者:tkb至简
声明:原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!
已将所有赞助者统一放到单独页面!签名处只保留最近10条赞助记录!查看赞助者列表
衷心感谢打赏者的厚爱与支持!也感谢点赞和评论的园友的支持! | |||
---|---|---|---|
打赏者 | 打赏金额 | 打赏日期 | |
微信:匿名 | 10.00 | 2017-08-03 | |
微信:匿名 | 10.00 | 2017-08-04 | |
微信:匿名 | 5.00 | 2017-06-15 | |
支付宝:一个名字499***@qq.com | 5.00 | 2017-06-14 | |
微信:匿名 | 16.00 | 2017-04-08 | |
支付宝:向京刘 | 10.00 | 2017-04-13 | |
微信:匿名 | 10.00 | 2017-003-08 | |
微信:匿名 | 5.00 | 2017-03-08 | |
支付宝:lll20001155 | 5.00 | 2017-03-03 | |
支付宝:她是一个弱女子 | 5.00 | 2017-03-02 |