AutoMapper的简单使用
1. 第一种方法,推荐!
添加一个功能类
using AutoMapper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AutoMapperTest2 { public static class AutoMapperConfig { public static IMapper Mapper = new Mapper(RegisterMappings()); public static MapperConfiguration RegisterMappings() { return new MapperConfiguration(cfg => { cfg.CreateMissingTypeMaps = true; cfg.AllowNullDestinationValues = false; cfg.ForAllPropertyMaps(IsToRepeatedField, (propertyMap, opts) => opts.UseDestinationValue()); cfg.ForAllPropertyMaps(IsToMapFieldField, (propertyMap, opts) => opts.UseDestinationValue()); cfg.AddProfile<OutputModels>(); }); bool IsToRepeatedField(PropertyMap pm) { if (pm.DestinationPropertyType.IsConstructedGenericType) { var destGenericBase = pm.DestinationPropertyType.GetGenericTypeDefinition(); return false;// destGenericBase == typeof(RepeatedField<>); } return false; } bool IsToMapFieldField(PropertyMap pm) { if (pm.DestinationPropertyType.IsConstructedGenericType) { var destGenericBase = pm.DestinationPropertyType.GetGenericTypeDefinition(); return false;// destGenericBase == typeof(MapField<,>); } return false; } } } public class OutputModels : Profile { public OutputModels() { } } }
使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AutoMapperTest2 { class Program { static void Main(string[] args) { var src = new source() { name = "jeff", age = 1, strList = new List<string>() { "1", "2", "3"}, classList = new List<aaa>() { new aaa(){a1="a1", a2=1}, new aaa(){a1="a2", a2=2}, new aaa(){a1="a3", a2=3}, } }; var tgt = AutoMapperConfig.Mapper.Map<target>(src); if (tgt != null) Console.WriteLine($"name = {tgt.name}"); } } public class source { public string name { get; set; } public int age { get; set; } public List<string> strList { get; set; } public List<aaa> classList { get; set; } } public class target { public string name { get; set; } public int age { get; set; } public List<string> strList { get; set; } public List<aaa> classList { get; set; } } public class aaa { public string a1 { get; set; } public int a2 { get; set; } } }
2. 第二种方法:
添加功能类
using AutoMapper; using System; using System.Collections.Generic; using System.Linq; using System.Web;
namespace TCG.DataCollection.Webservice { public sealed class Mapper { private static readonly Mapper instance = new Mapper(); private Mapper() { this.Init(); } public void Init() { AutoMapper.Mapper.Initialize(cfg => { departmentMapping(cfg); this.employeeMapping(cfg);this.defaultMapping<JobCoder, JobCodeModel>(cfg); this.defaultMapping<EmployeeTerminationData, EmployeeTerminationDataModel>(cfg); this.vestingMapping(cfg); }); } public static Dest Map<Src, Dest>(Src src) { if (instance != null) return AutoMapper.Mapper.Map<Src, Dest>(src); else throw new Exception("Automapper not initialized."); // TODO: 错误信息需集中定义。 } /// <summary> /// 提供默认的类型映射,双向映射,依据属性名称 /// </summary> /// <typeparam name="T1"></typeparam> /// <typeparam name="T2"></typeparam> /// <param name="cfg"></param> private void defaultMapping<T1, T2>(IMapperConfigurationExpression cfg) { cfg.CreateMap<T1, T2>(); cfg.CreateMap<T2, T1>(); } private void departmentMapping(IMapperConfigurationExpression cfg) { cfg.CreateMap<Department, DepartmentModel>() .ForMember(dest => dest.ParentDepartmentCode, options => options.MapFrom(src => string.IsNullOrWhiteSpace(src.ParentDepartmentCode) ? src.DepartmentCode : src.ParentDepartmentCode)); cfg.CreateMap<DepartmentModel, Department>() .ForMember(dest => dest.ParentDepartmentCode, options => options.MapFrom(src => src.ParentDepartmentCode)); } private void vestingMapping(IMapperConfigurationExpression cfg) { cfg.CreateMap<Vesting, VestingModel>() .ForMember(dest => dest.VestingDate, options => options.ResolveUsing<DateTime>(src => this.convertDate(src.VestingDate).GetValueOrDefault())); } private void grantMapping(IMapperConfigurationExpression cfg) { cfg.CreateMap<Grant, GrantModel>() .ForMember(dest => dest.GrantDate, options => options.ResolveUsing<DateTime>(src => { return this.convertDate(src.GrantDate).GetValueOrDefault(); })) .ForMember(dest => dest.GrantType, options => options.ResolveUsing<string>(src => this.convertGrantType(src.GrantType))) .ForMember(dest => dest.IsPerformanceBased, options => options.ResolveUsing<bool>(src => string.Equals(src.IsPerformanceBased, "Y", StringComparison.OrdinalIgnoreCase))); } private void reinstatementMapping(IMapperConfigurationExpression cfg) { cfg.CreateMap<ReinstatementData, ReinstatementDataModel>() .ForMember(dest => dest.ReinstatementDate, options => options.ResolveUsing<DateTime>(src => this.convertDate(src.ReinstatementDate).GetValueOrDefault())) .ForMember(dest => dest.Type, options => options.UseValue<ReinstatementType>(ReinstatementType.R)); } private void employeeMapping(IMapperConfigurationExpression cfg) { cfg.CreateMap<Employee, EmployeeModel>() .ForMember(dest => dest.SAFEforSubsequentSalse, options => options.ResolveUsing<string>(src => string.Equals(src.SAFEforSubsequentSalse, "Y", StringComparison.OrdinalIgnoreCase) ? "1" : string.Empty)); } private DateTime? convertDate(string date) { if (string.IsNullOrEmpty(date)) return null; var year = int.Parse(date.Substring(0, 4)); var month = int.Parse(date.Substring(4, 2)); var day = int.Parse(date.Substring(6, 2)); return new DateTime(year, month, day); } } }
使用时
var model = Mapper.Map<Employee, EmployeeModel>(data);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
2015-12-25 jquery datatables api (转)