一、最简单的用法

有两个类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 使用(一)的更多相关文章

  1. 恋爱虽易,相处不易:当EntityFramework爱上AutoMapper

    剧情开始 为何相爱? 相处的问题? 女人的伟大? 剧情收尾? 有时候相识即是一种缘分,相爱也不需要太多的理由,一个眼神足矣,当EntityFramework遇上AutoMapper,就是如此,恋爱虽易 ...

  2. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  3. AutoMapper

    什么是AutoMapper? AutoMapper是一个对象和对象间的映射器.对象与对象的映射是通过转变一种类型的输入对象为一种不同类型的输出对象工作的.让AutoMapper有意思的地方在于它提供了 ...

  4. AutoMapper随笔记

    平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先看效果:(完整Demo:https://git ...

  5. 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 ...

  6. AutoMapper的介绍与使用(一)

    软件环境 vs2015 asp.net mvc 5 .NET Framework 4.5.2 AutoMapper 5.2.0.0 AutoMapper安装 新建asp.net mvc 项目 Auto ...

  7. AutoMapper使用中的问题

    指定值只会执行一次 public class MomanBaseProfile : Profile { public MomanBaseProfile() { CreateMap<Request ...

  8. 【AutoMapper官方文档】DTO与Domin Model相互转换(中)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  9. 【AutoMapper官方文档】DTO与Domin Model相互转换(下)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  10. 【道德经】漫谈实体、对象、DTO及AutoMapper的使用

    写在前面 实体和值对象 实体和对象 故常无欲以观其妙,常有欲以观其徼 初始实体和演化实体 代码中的DTO AutoMapper实体转换 后记 实体(Entity).对象(Object).DTO(Dat ...

随机推荐

  1. Listview自定义了子View导致listview的onitemclick事件无效

    原因是子View的点击事件抢占了listview的点击事件 解决办法: 1. 子View根布局 设置 android:descendantFocusability="blocksDescen ...

  2. 2019ExcelVBA一些自己掉进过的坑

    1.公式手动重算问题 为避免代码执行过程中引发公式自动重算,拖慢运行速度,在代码中设置了公式手动重算,并计划在代码执行结束前恢复.如果在代码执行过程中捕获错误就直接退出,而没有执行到恢复公式自动重算, ...

  3. pandas中的空值处理

    1.空值 1.1 有两种丢失数据: None: Python自带的数据类型 不能参与到任何计算中 np.nan: float类型 能参与计算,但结果总是nan # None+2 # 报错 # np.n ...

  4. 解決 centos -bash: vim: command not found

    i. 那么如何安裝 vim 呢?输入rpm -qa|grep vim 命令, 如果 vim 已经正确安裝,会返回下面的三行代码: root@server1 [~]# rpm -qa|grep vim ...

  5. 依赖注入原理---IoC框架

    先来讲一讲,一个简单的依赖注入例子. 1. 依赖 如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖.例如下面类 Human 中用到一个 Fa ...

  6. Oracle 监听器日志配置与管理

    十一假期间,某客户因为监听日志问题导致系统登录挂起,当时在返京的路上,因客户业务不允许中断,无奈之下,借了个本子帮客户做了紧急处理,今天恰好有空,在网上搜了下有关监听日志的内容,发现一个不错的帖子,内 ...

  7. 基于FastJson的通用泛型解决方案

    由于项目使用的是fastjson,也无法换成其他的序列化框架,所以研究了一下他对泛型序列化和反序列化的支持能力,最终解决了这个问题. 要达成的目标 我的封装方式属于通用封装,我要达到的目标是如下的使用 ...

  8. 第一个博客——python通过值传递函数参数

    功能:银行账户计算利率(python实现) 部分代码: def addInterest(balance, rate): newBalance = balance * (1 + rate) balanc ...

  9. day19_python_1124

    .01 昨日内容回顾 面向对象:1,将一些相似功能的函数集合到一起 类:具有相同属性和功能的一类事物. 对象:类的具体体现. 2,站在上帝的角度考虑问题,类就是一个公共模板, 类的结构: class ...

  10. 基于lnmp环境安装Discuz

    安装环境 Linux:CentOS Linux release 7.5.1804 (Core) nginx:1.14.2 php-fpm:5.4.16 mariadb-server:5.5.60 基本 ...