标签 标签 标签
- 一句话的事儿:
一、最简单的用法
有两个类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 = 1,Name = "caoyc",Age = 20};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 = 1,Name = "caoyc",Age = 20};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 = 1,Name = "caoyc",Age = 20};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 = 1,Age = 20};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 = 1,Name="caoyc",Age = 20};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 = 1,Name="caoyc",Age = 20};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 0:destination = "男";break;case 1: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 = 0 };User user1 = new User() { Gender = 1 };User user2 = new User() { Gender = 2 };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>=0 && src.Age<=200));}}
使用代码
Mapper.Initialize(x => x.AddProfile<UserProfile>());User user0 = new User() { Age = 1 };User user1 = new User() { Age = 150 };User user2 = new User() { Age = 201 };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);
输出结果
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using AutoMapper;using System.Data;namespace ConsoleApplication2{class Program{static void Main(string[] args){//1.普通转换Name name1 = new Name() { FirstName = "L", LastName = "jz" };Mapper.CreateMap<Name, NameDto>().BeforeMap((name, nameDto) => Console.WriteLine("hello world before")).AfterMap((name, nameDto) => Console.WriteLine("hello world after"));NameDto nameDto1 = Mapper.Map<Name, NameDto>(name1);Console.WriteLine("1");Console.WriteLine(nameDto1.FirstName + nameDto1.LastName);Console.WriteLine();//Console.ReadKey();//整体设置//2.整体即时转换Mapper.Reset();Name name2 = new Name() { FirstName = "L", LastName = "jz" };Mapper.CreateMap<Name, NameDto>().ConstructUsing(name => new NameDto() { AllName = name.FirstName + name.LastName });NameDto nameDto2 = Mapper.Map<Name, NameDto>(name2);Console.WriteLine("2");Console.WriteLine(nameDto2.AllName);Console.WriteLine();//Console.ReadKey();//3.整体通过TypeConverter类型转换Mapper.Reset();Name name3 = new Name() { FirstName = "L", LastName = "jz" };Mapper.CreateMap<Name, NameDto>().ConvertUsing<NameConverter>();NameDto nameDto3 = Mapper.Map<Name, NameDto>(name3);Console.WriteLine("3");Console.WriteLine(nameDto3.AllName);Console.WriteLine();//Console.ReadKey();//单属性设置//4.属性条件转换Mapper.Reset();Name name4 = new Name() { FirstName = "L", LastName = "jz" };Mapper.CreateMap<Name, NameDto>().ForMember(name => name.FirstName, opt => opt.Condition(name => !name.FirstName.Equals("l", StringComparison.OrdinalIgnoreCase)));NameDto nameDto4 = Mapper.Map<Name, NameDto>(name4);Console.WriteLine("4");Console.WriteLine(string.IsNullOrEmpty(nameDto4.FirstName));Console.WriteLine();//Console.ReadKey();//5.属性忽略Mapper.Reset();Name name5 = new Name() { FirstName = "L", LastName = "jz" };Mapper.CreateMap<Name, NameDto>().ForMember(name => name.FirstName, opt => opt.Ignore());NameDto nameDto5 = Mapper.Map<Name, NameDto>(name5);Console.WriteLine("5");Console.WriteLine(string.IsNullOrEmpty(nameDto5.FirstName));Console.WriteLine();//Console.ReadKey();//6.属性转换Mapper.Reset();Name name6 = new Name() { FirstName = "L", LastName = "jz" };Mapper.CreateMap<Name, NameDto>().ForMember(name => name.AllName, opt => opt.MapFrom(name => name.FirstName + name.LastName)).ForMember(name => name.FirstName, opt => opt.MapFrom(name=>name.FirstName));NameDto nameDto6 = Mapper.Map<Name, NameDto>(name6);Console.WriteLine("6");Console.WriteLine(nameDto6.AllName);Console.WriteLine();//Console.ReadKey();//7.属性通过ValueResolver转换Mapper.Reset();Name name7 = new Name() { FirstName = "L", LastName = "jz" };Mapper.CreateMap<Name, StoreDto>().ForMember(storeDto => storeDto.Name, opt => opt.ResolveUsing<NameResolver>());StoreDto store1 = Mapper.Map<Name, StoreDto>(name7);Console.WriteLine("7");Console.WriteLine(store1.Name.FirstName + store1.Name.LastName);Console.WriteLine();//Console.ReadKey();//8.属性填充固定值Mapper.Reset();Name name8 = new Name() { FirstName = "L", LastName = "jz" };Mapper.CreateMap<Name, NameDto>().ForMember(name => name.AllName, opt => opt.UseValue<string>("ljzforever"));NameDto nameDto8 = Mapper.Map<Name, NameDto>(name8);Console.WriteLine("8");Console.WriteLine(nameDto8.AllName);Console.WriteLine();//Console.ReadKey();//9.属性格式化Mapper.Reset();Name name9 = new Name() { FirstName = "L", LastName = "jz" };Mapper.CreateMap<Name, NameDto>().ForMember(name => name.FirstName, opt => opt.AddFormatter<StringFormatter>());NameDto nameDto9 = Mapper.Map<Name, NameDto>(name9);Console.WriteLine("9");Console.WriteLine(nameDto9.FirstName);Console.WriteLine();//Console.ReadKey();//10.属性null时的默认值Mapper.Reset();Name name10 = new Name() { FirstName = "L" };Mapper.CreateMap<Name, NameDto>().ForMember(name => name.LastName, opt => opt.NullSubstitute("jz"));NameDto nameDto10 = Mapper.Map<Name, NameDto>(name10);Console.WriteLine("10");Console.WriteLine(nameDto10.LastName);Console.WriteLine();//Console.ReadKey();//其它设置与特性//11.转换匿名对象Mapper.Reset();object name11 = new { FirstName = "L", LastName = "jz" };NameDto nameDto11 = Mapper.DynamicMap<NameDto>(name11);Console.WriteLine("11");Console.WriteLine(nameDto11.FirstName + nameDto11.LastName);Console.WriteLine();//Console.ReadKey();//12.转换DataTableMapper.Reset();DataTable dt = new DataTable();dt.Columns.Add("FirstName", typeof(string));dt.Columns.Add("LastName", typeof(string));dt.Rows.Add("L", "jz");List<NameDto> nameDto12 = Mapper.DynamicMap<IDataReader, List<NameDto>>(dt.CreateDataReader());Console.WriteLine("12");Console.WriteLine(nameDto12[0].FirstName + nameDto12[0].LastName);Console.WriteLine();//Console.ReadKey();//emitMapper error//List<NameDto> nameDto20 = EmitMapper.ObjectMapperManager.DefaultInstance.GetMapper<IDataReader, List<NameDto>>().Map(dt.CreateDataReader());//13.转化存在的对象Mapper.Reset();Mapper.CreateMap<Name, NameDto>().ForMember(name => name.LastName, opt => opt.Ignore());Name name13 = new Name() { FirstName = "L" };NameDto nameDto13 = new NameDto() { LastName = "jz" };Mapper.Map<Name, NameDto>(name13, nameDto13);//nameDto13 = Mapper.Map<Name, NameDto>(name13);//注意,必需使用上面的写法,不然nameDto13对象的LastName属性会被覆盖Console.WriteLine("13");Console.WriteLine(nameDto13.FirstName + nameDto13.LastName);Console.WriteLine();//Console.ReadKey();//14.Flatten特性 Store.Name.FirtName=FlattenName.NameFirstnameMapper.Reset();Mapper.CreateMap<Store, FlattenName>();Store store2 = new Store() { Name = new Name() { FirstName = "L", LastName = "jz" } };FlattenName nameDto14 = Mapper.Map<Store, FlattenName>(store2);Console.WriteLine("14");Console.WriteLine(nameDto14.NameFirstname + nameDto14.NameLastName);Console.WriteLine();//Console.ReadKey();//15.将Dictionary转化为对象,现在还不支持Mapper.Reset();Mapper.CreateMap<Dictionary<string, object>, Name>();Dictionary<string, object> dict = new Dictionary<string, object>();dict.Add("FirstName", "L");//Name name15 = Mapper.DynamicMap<Dictionary<string, object>, Name>(dict);Name name15 = Mapper.Map<Dictionary<string, object>, Name>(dict);Console.WriteLine("15");Console.WriteLine(name15.FirstName);Console.WriteLine();Console.ReadKey();}}public class Store{public Name Name { get; set; }public int Age { get; set; }}public class Name{public string FirstName { get; set; }public string LastName { get; set; }}public class StoreDto{public NameDto Name { get; set; }public int Age { get; set; }}public class NameDto{public string FirstName { get; set; }public string LastName { get; set; }public string AllName { get; set; }}public class FlattenName{public string NameFirstname { get; set; }public string NameLastName { get; set; }}public class NameConverter : TypeConverter<Name, NameDto>{protected override NameDto ConvertCore(Name source){return new NameDto() { AllName = source.FirstName + source.LastName };}}public class NameResolver : ValueResolver<Name, NameDto>{protected override NameDto ResolveCore(Name source){return new NameDto() { FirstName = source.FirstName, LastName = source.LastName,AllName=source.FirstName+source.LastName };}}public class NameFormatter : ValueFormatter<NameDto>{protected override string FormatValueCore(NameDto name){return name.FirstName + name.LastName;}}public class StringFormatter : ValueFormatter<string>{protected override string FormatValueCore(string name){return name + "-";}}}
- 本文作者:GeekPower - Felix Sun
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!



