c# automapper 使用(一)
一、最简单的用法
有两个类User和UserDto
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
} public class UserDto
{
public string Name { get; set; }
public int Age { get; set; }
}
将User转换成UserDto也和简单
Mapper.Initialize(x => x.CreateMap<User, UserDto>());
User user = new User()
{
Id = ,
Name = "caoyc",
Age =
};
var dto = Mapper.Map<UserDto>(user);
这是一种最简单的使用,AutoMapper会更加字段名称去自动对于,忽略大小写。
二、如果属性名称不同
将UserDto的Name属性改成Name2
Mapper.Initialize(x =>
x.CreateMap<User, UserDto>()
.ForMember(d =>d.Name2, opt => {
opt.MapFrom(s => s.Name);
})
); User user = new User()
{
Id = ,
Name = "caoyc",
Age =
}; var dto = Mapper.Map<UserDto>(user);

三、使用Profile配置
自定义一个UserProfile类继承Profile,并重写Configure方法
public class UserProfile : Profile
{
protected override void Configure()
{
CreateMap<User, UserDto>()
.ForMember(d => d.Name2, opt =>
{
opt.MapFrom(s => s.Name);
});
}
}
使用时就这样
Mapper.Initialize(x => x.AddProfile<UserProfile>());
User user = new User()
{
Id = ,
Name = "caoyc",
Age =
};
var dto = Mapper.Map<UserDto>(user);
四、空值替换NullSubstitute
空值替换允许我们将Source对象中的空值在转换为Destination的值的时候,使用指定的值来替换空值。
public class UserProfile : Profile
{
protected override void Configure()
{
CreateMap<User, UserDto>()
.ForMember(d => d.Name2, opt => opt.MapFrom(s => s.Name))
.ForMember(d => d.Name2, opt => opt.NullSubstitute("值为空")); }
}
Mapper.Initialize(x => x.AddProfile<UserProfile>());
User user = new User()
{
Id = ,
Age =
};
var dto = Mapper.Map<UserDto>(user);
结果为:

五、忽略属性Ignore
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
} public class UserDto
{
public string Name { get; set; }
public int Age { get; set; } } public class UserProfile : Profile
{
protected override void Configure()
{
CreateMap<User, UserDto>().ForMember("Name", opt => opt.Ignore());
}
}
使用
Mapper.Initialize(x => x.AddProfile<UserProfile>());
User user = new User()
{
Id = ,
Name="caoyc",
Age =
};
var dto = Mapper.Map<UserDto>(user);
结果:

六、预设值
如果目标属性多于源属性,可以进行预设值
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
} public class UserDto
{
public string Name { get; set; }
public int Age { get; set; }
public string Gender { get; set; } } public class UserProfile : Profile
{
protected override void Configure()
{
CreateMap<User, UserDto>();
}
}
使用
Mapper.Initialize(x => x.AddProfile<UserProfile>());
User user = new User()
{
Id = ,
Name="caoyc",
Age =
};
UserDto dto = new UserDto() {Gender = "男"};
Mapper.Map(user, dto);

七、类型转换ITypeConverter
如果数据中Gender存储的int类型,而DTO中Gender是String类型
public class User
{
public int Gender { get; set; }
} public class UserDto
{
public string Gender { get; set; }
}
类型转换类,需要实现接口ITypeConverter
public class GenderTypeConvertert : ITypeConverter<int, string>
{
public string Convert(int source, string destination, ResolutionContext context)
{
switch (source)
{
case :
destination = "男";
break;
case :
destination = "女";
break;
default:
destination = "未知";
break;
}
return destination;
}
}
配置规则
public class UserProfile : Profile
{
protected override void Configure()
{
CreateMap<User, UserDto>(); CreateMap<int, string>().ConvertUsing<GenderTypeConvertert>();
//也可以写这样
//CreateMap<int, string>().ConvertUsing(new GenderTypeConvertert());
}
}
使用
Mapper.Initialize(x => x.AddProfile<UserProfile>());
User user0 = new User() { Gender = };
User user1 = new User() { Gender = };
User user2 = new User() { Gender = };
var dto0= Mapper.Map<UserDto>(user0);
var dto1 = Mapper.Map<UserDto>(user1);
var dto2 = Mapper.Map<UserDto>(user2);
Console.WriteLine("dto0:{0}", dto0.Gender);
Console.WriteLine("dto1:{0}", dto1.Gender);
Console.WriteLine("dto2:{0}", dto2.Gender);
结果

八、条件约束Condition
当满足条件时才进行映射字段,例如人类年龄,假设我们现在人类年龄范围为0-200岁(这只是假设),只有满足在这个条件才进行映射
DTO和Entity
public class User
{
public int Age { get; set; }
} public class UserDto
{
public int Age { get; set; }
}
Profile
public class UserProfile : Profile
{
protected override void Configure()
{
CreateMap<User, UserDto>().ForMember(dest=>dest.Age,opt=>opt.Condition(src=>src.Age>= && src.Age<=));
}
}
使用代码
Mapper.Initialize(x => x.AddProfile<UserProfile>());
User user0 = new User() { Age = };
User user1 = new User() { Age = };
User user2 = new User() { Age = };
var dto0= Mapper.Map<UserDto>(user0);
var dto1 = Mapper.Map<UserDto>(user1);
var dto2 = Mapper.Map<UserDto>(user2);
Console.WriteLine("dto0:{0}", dto0.Age);
Console.WriteLine("dto1:{0}", dto1.Age);
Console.WriteLine("dto2:{0}", dto2.Age);
输出结果

c# automapper 使用(一)的更多相关文章
- 恋爱虽易,相处不易:当EntityFramework爱上AutoMapper
剧情开始 为何相爱? 相处的问题? 女人的伟大? 剧情收尾? 有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易 ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(上)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- AutoMapper
什么是AutoMapper? AutoMapper是一个对象和对象间的映射器.对象与对象的映射是通过转变一种类型的输入对象为一种不同类型的输出对象工作的.让AutoMapper有意思的地方在于它提供了 ...
- AutoMapper随笔记
平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先看效果:(完整Demo:https://git ...
- AutoMapper:Unmapped members were found. Review the types and members below. Add a custom mapping expression, ignore, add a custom resolver, or modify the source/destination type
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 应用场景:ViewModel==>Mode映射的时候出错 AutoMappe ...
- AutoMapper的介绍与使用(一)
软件环境 vs2015 asp.net mvc 5 .NET Framework 4.5.2 AutoMapper 5.2.0.0 AutoMapper安装 新建asp.net mvc 项目 Auto ...
- AutoMapper使用中的问题
指定值只会执行一次 public class MomanBaseProfile : Profile { public MomanBaseProfile() { CreateMap<Request ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(中)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(下)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- 【道德经】漫谈实体、对象、DTO及AutoMapper的使用
写在前面 实体和值对象 实体和对象 故常无欲以观其妙,常有欲以观其徼 初始实体和演化实体 代码中的DTO AutoMapper实体转换 后记 实体(Entity).对象(Object).DTO(Dat ...
随机推荐
- Selenium3.6.0+Firefox55+JDK8.0配置
一.安装JDK8.0(自行百度安装步骤) 二.在eclipse的偏好设置中选择java版本为8.0 三.Maven配置 <project xmlns="http://maven.apa ...
- 在客户端先通过JS验证后再将表单提交到服务器
问题:想要在客户端先通过JS验证后再将表单提交到服务器 参考资料: jQuery 事件 - submit() 方法 试验过程: 服务器端使用PHP <html> <head> ...
- MVC查看详细数据【四】
一.本篇文章主要讲解点击详细,将主键id的值传递到后端,或者将多个值传递给后台的三种方式,并且通过id的值在数据库中查找到相对应的数据,赋值给viewData视图. 1. 第一种将主键id的值传递给后 ...
- [原]编译flightGear
参考:flightgear编译博客201705 flightGear是三维飞行仿真软件,这个款软件是开源的,我们尝试用其源码完整编译一遍这个工程,并使用它. 它用到里以下扩展库: 空气动力学库:JSB ...
- 每天跟着书敲Mysql
要深入学下Mysql操作啦 CRUD,create,retrieve,update,delete
- DFS 之 全排列
题目描述输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 我们可以模拟出n个盒子和n张卡片,我们需要将n张卡片分别放到n个盒子里,且每个盒子只能放1张卡 ...
- 详细解析HTML基础结构
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- [sgu P155] Cartesian Tree
155. Cartesian Tree time limit per test: 0.25 sec. memory limit per test: 65536 KB input: standard i ...
- 多线程中Object的wait(),notify()和Condition的wait()和singal()对锁的关联
通常将共享资源的操作放置在Sysnchronized定义的区域内,这样当其他线程也获取到这个锁时,必须的等待锁被释放时才能进入该区域.Object为任意一个对象,每个对象都存在一个标志位,并具有两个值 ...
- Win10系列:C#应用控件基础10
PasswordBox控件 在应用程序的登录界面中,有时需要用户输入用户名和密码进行身份验证,应用程序中的密码框可以通过使用PasswordBox控件来实现.PasswordBox控件与TextBox ...