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 ...
随机推荐
- 【IOS】#import和#include有什么区别,@class呢,#import<>跟#import ""有什么区别?
1.#import是object-c导入头文件的关键字,#include是C/c++导入头文件的关键字,使用#import导入头文件会自动只导入一次,不会重复导入. 2.@class是告诉编译器某个类 ...
- vue--vux框架的使用
<1>. 在项目里安装vux npm install vux --save <2>. 安装vux-loader npm install vux-loader --save-de ...
- CSS之user-select——设置标签中的文字是否可被复制
详细介绍请参考 http://www.css88.com/book/css/properties/user-interface/user-select.htm CSS样式 user-select:no ...
- Oracle 12c RAC
前提环境(ip,内核参数,环境变量,存储等等...)已准备好. (一) 安装grid 1. Grid用户登录上传并解压 上传linuxx64_12201_grid_home.zip至/u01/ ...
- obs studio 使用
专业,开源,无广告,免费,录屏/推流神器--obs studio 稍微简单的也有captura, 原理:调用本地API获取音频流,图像流(全屏幕,单个windows窗口的图像输出)->开源音视频 ...
- 开机自动启动WEB服务,共享目录。
最近工作中,需要共享一个目录,每次重启总要手动执行一下 nohup python -m SimpleHTTPServer 8000这个命令,想着实现让它开机自动启动,就一劳永逸了. 手动步骤如下: ...
- Multivariate normal distribution | 多元正态分布
现在终于需要用到了.
- guxh的python笔记五:面向对象
1,面向对象编程思想 类:一类具有相同属性的抽象 属性(静态属性):实例变量.类变量.私有属性 方法(动态属性):构造函数.析构函数(默认就有).函数.私有函数 对象/实例:类经过实例化后,就是对象/ ...
- Thread的中断机制(interrupt)
先看收集了别人的文章,全面的了解下java的中断: 中断线程 线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡.还是等待新的 ...
- Cassandra集群:一,搭建一个三节点的集群
环境准备 JDK1.8 http://download.oracle.com/otn/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8 ...