下面直接上代码
扩展方法
public static class Ext
{
#region 对象或集合,字段不一致 自定义转换规则 Mapping
/// <summary>
/// 集合列表类型映射,默认字段名字一一对应
/// </summary>
/// <typeparam name="TResult">转化之后的model,可以理解为viewmodel</typeparam>
/// <typeparam name="TSource">要被转化的实体,Entity</typeparam>
/// <param name="source">可以使用这个扩展方法的类型,任何引用类型</param>
/// <returns>转化之后的实体列表</returns>
public static TResult ToMap<TSource, TResult>(this TSource source, MapperConfiguration config) where TResult : class where TSource : class
{
if (source == null) return default(TResult);
return config.CreateMapper().Map<TResult>(source);
}
#endregion
#region 字段一致之间转换
#region 字段一致对象实体之间转换
/// <summary>
/// 字段一致对象实体之间转换
/// </summary>
/// <typeparam name="TResult"></typeparam>
/// <param name="self"></param>
/// <returns></returns>
public static TResult ToMap<TSource, TResult>(this TSource source)
{
if (source == null)
return default(TResult);
Mapper.Reset();
Mapper.Initialize(x => x.CreateMap<TSource, TResult>());
return Mapper.Map<TResult>(source);
}
#endregion
#region 字段一致集合之间转换
/// <summary>
/// 字段一致集合之间转换
/// </summary>
/// <typeparam name="TSource"></typeparam>
/// <typeparam name="TResult"></typeparam>
/// <param name="source"></param>
/// <returns></returns>
public static IEnumerable<TResult> ToMap<TSource, TResult>(this IEnumerable source)
{
if (source == null) return default(IEnumerable<TResult>);
Mapper.Reset();
Mapper.Initialize(x => x.CreateMap<TSource, TResult>());
return Mapper.Map(source, source.GetType(), typeof(IEnumerable<TResult>)) as IEnumerable<TResult>;
}
#endregion
#endregion
}
测试:
using AutoMapper; using System; using System.Collections.Generic; namespace ConsoleApp1 { class Program { static void Main(string[] args) { Mapp(); Console.WriteLine("Hello World!"); } static void Mapp() { #region 实例一 源实体与转换后实体字段不一致 指定字段一一对应,并转化指定的格式 var config = new MapperConfiguration(cfg => cfg.CreateMap<Source, Destination>() #region MapFrom 指定字段一一对应,并转化指定的格式 .ForMember(d => d.Year, o => o.MapFrom(src => $"年:{src.CurrentDateTime.Year}")) .ForMember(d => d.Month, o => o.MapFrom(src => $"月:{src.CurrentDateTime.Month}")) .ForMember(d => d.Day, o => o.MapFrom(src => $"日:{src.CurrentDateTime.Day}")) .ForMember(d => d.Hour, o => o.MapFrom(src => $"时:{ src.CurrentDateTime.Hour}")) .ForMember(d => d.Minute, o => o.MapFrom(src => $"分:{src.CurrentDateTime.Minute}")) .ForMember(d => d.Second, o => o.MapFrom(src => $"秒:{src.CurrentDateTime.Second}")) .ForMember(d => d.DateTime, o => o.MapFrom(src => $"{src.CurrentDateTime.ToLocalTime()}")) #endregion ); Source source = new Source { CurrentDateTime = DateTime.Now }; List<Source> sourceList = new List<Source>(); for (int i = 0; i < 1000; i++) { sourceList.Add(new Source { CurrentDateTime = DateTime.Now.AddDays(i) }); } #endregion Destination result = source.ToMap<Source, Destination>(config); List<Destination> resultList = sourceList.ToMap<List<Source>, List<Destination>>(config); Destination result2 = source.ToMap<Source, Destination>(); var resultList2 = sourceList.ToMap<Source, Destination>(); } } public class Source { public DateTime CurrentDateTime { get; set; } } public class Destination { public string Year { get; set; } public string Month { get; set; } public string Day { get; set; } public string Hour { get; set; } public string Minute { get; set; } public string Second { get; set; } public string DateTime { get; set; } public DateTime currentdatetime { get; set; } } }
效果图: