/// <summary>
/// AutoMapper扩展帮助类
/// </summary>
public static class AutoMapperExtension
{
/// <summary>
/// 类型映射
/// </summary>
/// <typeparam name="TDestination">映射后的对象</typeparam>
/// <param name="obj">要映射的对象</param>
/// <returns></returns>
public static TDestination MapTo<TDestination>(this object obj) where TDestination : class
{
if (obj == null) return default(TDestination); var config = new MapperConfiguration(cfg => cfg.CreateMap<TDestination, object>());
var mapper = config.CreateMapper();
return mapper.Map<TDestination>(obj);
} /// <summary>
/// 集合列表类型映射
/// </summary>
/// <typeparam name="TDestination">目标对象类型</typeparam>
/// <param name="source">数据源</param>
/// <returns></returns>
public static List<TDestination> MapTo<TDestination>(this IEnumerable source) where TDestination : class
{
if (source == null) return default(List<TDestination>); var config = new MapperConfiguration(cfg => cfg.CreateMap(source.GetType(), typeof(TDestination)));
var mapper = config.CreateMapper();
return mapper.Map<List<TDestination>>(source);
} /// <summary>
/// 集合列表类型映射
/// </summary>
/// <typeparam name="TSource">数据源类型</typeparam>
/// <typeparam name="TDestination">目标对象类型</typeparam>
/// <param name="source">数据源</param>
/// <returns></returns>
public static List<TDestination> MapTo<TSource, TDestination>(this IEnumerable<TSource> source)
where TDestination : class
where TSource : class
{
if (source == null) return new List<TDestination>(); var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>());
var mapper = config.CreateMapper();
return mapper.Map<List<TDestination>>(source);
} /// <summary>
/// 集合列表类型映射
/// </summary>
/// <typeparam name="TSource">数据源类型</typeparam>
/// <typeparam name="TDestination">目标对象类型</typeparam>
/// <param name="source">数据源</param>
/// <param name="configure">自定义配置</param>
/// <returns></returns>
public static List<TDestination> MapTo<TSource, TDestination>(this IEnumerable<TSource> source, Action<IMapperConfiguration> configure)
where TDestination : class
where TSource : class
{
if (source == null) return new List<TDestination>(); var config = new MapperConfiguration(configure);
var mapper = config.CreateMapper();
return mapper.Map<List<TDestination>>(source);
} /// <summary>
/// 类型映射
/// </summary>
/// <typeparam name="TSource">数据源类型</typeparam>
/// <typeparam name="TDestination">目标对象类型</typeparam>
/// <param name="source">数据源</param>
/// <param name="destination">目标对象</param>
/// <returns></returns>
public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
where TSource : class
where TDestination : class
{
if (source == null) return destination; var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>());
var mapper = config.CreateMapper();
return mapper.Map<TSource, TDestination>(source, destination);
} /// <summary>
/// 类型映射,默认字段名字一一对应
/// </summary>
/// <typeparam name="TDestination">转化之后的model,可以理解为viewmodel</typeparam>
/// <typeparam name="TSource">要被转化的实体,Entity</typeparam>
/// <param name="source">可以使用这个扩展方法的类型,任何引用类型</param>
/// <returns>转化之后的实体</returns>
public static TDestination MapTo<TSource, TDestination>(this TSource source)
where TDestination : class
where TSource : class
{
if (source == null) return default(TDestination); var config = new MapperConfiguration(cfg => cfg.CreateMap<TSource, TDestination>());
var mapper = config.CreateMapper();
return mapper.Map<TDestination>(source);
} /// <summary>
/// DataReader映射
/// </summary>
/// <typeparam name="T">目标对象类型</typeparam>
/// <param name="reader">数据源</param>
/// <returns></returns>
public static IEnumerable<T> MapTo<T>(this IDataReader reader)
{
var config = new MapperConfiguration(cfg => cfg.CreateMap<IDataReader, IEnumerable<T>>());
var mapper = config.CreateMapper();
return mapper.Map<IDataReader, IEnumerable<T>>(reader);
} /// <summary>
/// 将 DataTable 转为实体对象
/// </summary>
/// <typeparam name="T">目标对象类型</typeparam>
/// <param name="dt">数据源</param>
/// <returns></returns>
public static List<T> MapTo<T>(this DataTable dt)
{
if (dt == null || dt.Rows.Count == )
return default(List<T>); var config = new MapperConfiguration(cfg => cfg.CreateMap<IDataReader, List<T>>());
var mapper = config.CreateMapper();
return mapper.Map<IDataReader, List<T>>(dt.CreateDataReader());
} /// <summary>
/// 将List转换为Datatable
/// </summary>
/// <typeparam name="T">目标对象类型</typeparam>
/// <param name="list">数据源</param>
/// <returns></returns>
public static DataTable MapTo<T>(this IEnumerable<T> list)
{
if (list == null) return default(DataTable); //创建属性的集合
List<PropertyInfo> pList = new List<PropertyInfo>();
//获得反射的入口
System.Type type = typeof(T);
DataTable dt = new DataTable();
//把所有的public属性加入到集合 并添加DataTable的列
Array.ForEach<PropertyInfo>(type.GetProperties(), p => { pList.Add(p); dt.Columns.Add(p.Name, p.PropertyType); });
foreach (var item in list)
{
//创建一个DataRow实例
DataRow row = dt.NewRow();
//给row 赋值
pList.ForEach(p => row[p.Name] = p.GetValue(item, null));
//加入到DataTable
dt.Rows.Add(row);
}
return dt;
}
}

调用方式:

[TestMethod]
private void MapToTest()
{
UserInfo userInfo = new UserInfo
{
PK = ,
UserId = "",
RealName = "大师兄",
DepartmentId = "",
DepartmentName = "技术部",
Sex = ,
UserOnLine = ,
CreateTime = DateTime.Now,
Age =
}; IEnumerable<UserInfo> userInfos = new List<UserInfo>
{
new UserInfo
{
PK = ,
UserId = "",
RealName = "MrZhaoYi",
DepartmentId = "",
DepartmentName = "技术部",
Sex = ,
UserOnLine = ,
CreateTime = DateTime.Now
},
new UserInfo
{
PK = ,
UserId = "",
RealName = "MrZhaoYi2",
DepartmentId = "",
DepartmentName = "技术部",
Sex = ,
UserOnLine = ,
CreateTime = DateTime.Now
}
}; DataTable dataTable = new DataTable("MyTable");
DataColumn column = new DataColumn("UserId", typeof(string));
dataTable.Columns.Add(column); DataRow dr = dataTable.NewRow();
dr["UserId"] = "";
dataTable.Rows.Add(dr); UserInfoDTO dto1 = userInfo.MapTo<UserInfoDTO>(); UserInfoDTO dto2 = userInfo.MapTo<UserInfo, UserInfoDTO>(); List<UserInfoDTO> userInfoDtos1 = userInfos.MapTo<UserInfo, UserInfoDTO>(); List<UserInfoDTO> userInfoDtos2 = userInfos.MapTo<UserInfoDTO>(); List<UserInfoDTO> userInfoDtos3 = dataTable.MapTo<UserInfoDTO>(); //viewmodel与实体字段名字没有全部对应,只有几个字段的名字和源实体中的字段名字是一样的,其他的字段是通过实体中的几个字段组合或者是格式或者是类型转化而来的
//var config2 = new MapperConfiguration(
// cfg => cfg.CreateMap<UserInfo, UserInfoDTO>()
// .ForMember(d => d.UID, opt => opt.MapFrom(s => s.PK)) //指定字段一一对应
// .ForMember(d => d.AddTime, opt => opt.MapFrom(src => src.CreateTime.ToString("yy-MM-dd")))//指定字段,并转化指定的格式
// .ForMember(d => d.Age, opt => opt.Condition(src => src.Age > 5))//条件赋值
// .ForMember(d => d.DepartmentName, opt => opt.Ignore())//忽略该字段,不给该字段赋值
// .ForMember(d => d.RealName, opt => opt.NullSubstitute("Default Value"))//如果源字段值为空,则赋值为 Default Value
// .ForMember(d => d.Ex, opt => opt.MapFrom(src => src.PK + "_" + src.UserId + "_" + src.RealName)));//可以自己随意组合赋值
//var mapper2 = config2.CreateMapper();
//UserInfoDTO dto1 = mapper2.Map<UserInfoDTO>(userInfo); //Console.WriteLine(dto1.RealName);
}

实体类:

public class UserInfo
{
public int PK { get; set; }
public int Age { get; set; } /// <summary>
/// 用户ID
/// </summary>
public string UserId { get; set; }
/// <summary>
/// 真实姓名
/// </summary>
public string RealName { get; set; }
/// <summary>
/// 部门ID
/// </summary>
public string DepartmentId { get; set; }
/// <summary>
/// 部门名称
/// </summary>
public string DepartmentName { get; set; }
/// <summary>
/// 是否在线 1-在线 0-离线
/// </summary>
public int UserOnLine { get; set; } public DateTime CreateTime { get; set; } public int Sex { get; set; }
} public class UserInfoDTO
{
//public int UID { get; set; }
//public int Age { get; set; }
//public string Ex { get; set; }
//public DateTime AddTime { get; set; } /// <summary>
/// 用户ID
/// </summary>
public string UserId { get; set; }
/// <summary>
/// 真实姓名
/// </summary>
public string RealName { get; set; }
/// <summary>
/// 部门ID
/// </summary>
public string DepartmentId { get; set; }
/// <summary>
/// 部门名称
/// </summary>
public string DepartmentName { get; set; }
/// <summary>
/// 是否在线 1-在线 0-离线
/// </summary>
public int UserOnLine { get; set; }
}

AutoMapper扩展帮助类的更多相关文章

  1. Silverlight实例教程 - 自定义扩展Validation类,验证框架的总结和建议(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  2. codeigniter框架扩展核心类---实现前台后台视图的分离

    1. 扩展核心类,主要作用就是扩展系统现在的功能. 为前台增加独立的视图文件夹: a. 自定义路径常量 :在application ->config/  constants.php中增加 /*m ...

  3. YII 1.0 扩展第三方类

    扩展缩略图类在blog\protected\extensions 中建立 Image/CThumb.php 1. 自己瞎弄的,一点都不优雅 include_once Yii::app()->Ba ...

  4. 自定义 Django的User Model,扩展 AbstractUser类注意事项

    本篇主要讨论一下User Model的使用技巧. 注意, 由于Django 1.5之后user model带来了很大的变化, 本篇内容只针对django 1.5之后的版本. 1. 确定 User Mo ...

  5. ASP.NET MVC 扩展HtmlHelper类为 js ,css 资源文件添加版本号

    写在前面 在项目部署当中会需要更新 css 文件或 js 等资源文件,为了避免由于浏览器缓存的原因无法加载新的 css 或 js ,一般的做法是在资源文件的后面加上一个版本号来解决,这样浏览器就会去服 ...

  6. Scala中使用implict 扩展现有类的方法

    Scala中implict的一种用法就是扩展现有类的方法,有点类似于.Net中的扩展方法(MS对扩展方法的介绍:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改 ...

  7. [Swift]在Swift中实现自增(++)、自减(--)运算符:利用extension扩展Int类

    自增(++).自减(--)运算符主要用在For循环中,Swift有自己更简易的循环遍历方法,而且类似x- ++x这种代码不易维护. Swift为了营造自己的编码风格,树立自己的代码精神体系,已经不支持 ...

  8. DataTable和DataRow利用反射直接转换为Model对象的扩展方法类

    DataTable和DataRow利用反射直接转换为Model对象的扩展方法类   /// <summary> /// 类 说 明:给DataTable和DataRow扩展方法,直接转换为 ...

  9. 11.Laravel5学习笔记:扩展 Validator 类

    简单介绍 在 Laravel5 中,本身已经提供了丰富的验证规则供我们使用,可是天下应用奇葩多,做为程序猿你会发现永远都有新的验证规则诞生,光是组合已经解救不了你的项目了.这个时候就须要我们扩展 Va ...

随机推荐

  1. Best free and public DNS servers of 2019

    1. OpenDNSPrimary, secondary DNS servers: 208.67.222.222 and 208.67.220.220 2. CloudflarePrimary, se ...

  2. Web前端-JavaScript基础教程下

    Web前端-JavaScript基础教程下 <script>有6个属性: async对外部脚本有效,可以用来异步操作,下载东西,不妨碍其他操作. charset为src属性指定字符集. d ...

  3. Codeforces 1153F Serval and Bonus Problem [积分,期望]

    Codeforces 思路 去他的DP,暴力积分多好-- 首先发现\(l\)没有用,所以不管它. 然后考虑期望的线性性,可以知道答案就是 \[ \int_0^1 \left[ \sum_{i=k}^n ...

  4. Input类中常用的验证方式

    Deolin一般将Input类对象作为POST请求方法的参数, Input类的域与前端的数据结构一一对应,由于后端不应该相信前端传过来的任何数据, 所以前端的数据对象先绑定到Input对象中,通过JS ...

  5. jmeter压测过程中报java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider

    由于在java中添加了第三方安全策略文件,具体请看https://www.cnblogs.com/mrjade/p/10886378.html,导致在用jmeter压测过程中会遇到以下错误 解决办法: ...

  6. 简述with原理

    with open('x') as f: for line in f: print(line.replace('a', 'b')) 不管在处理文件过程中是否发生异常,都能保证 with 语句执行完毕后 ...

  7. springboot连接redis进行CRUD

    springboot连接redis进行CRUD: 1.添加以下依赖: <dependency> <groupId>org.springframework.boot</gr ...

  8. Hadoop(3)如何构建HDFS--HA,YARN---HA

    什么是HA? HA的意思是High Availability高可用,指当当前工作中的机器宕机后,会自动处理这个异常,并将工作无缝地转移到其他备用机器上去,以来保证服务的高可用. HA方式安装部署才是最 ...

  9. [提权]CVE-2018-8120漏洞复现

    0x01 漏洞名称 Windows操作系统Win32k的内核提权漏洞 0x02 漏洞编号 CVE-2018-8120 0x03 漏洞描述 部分版本Windows系统win32k.sys组件的NtUse ...

  10. Radix Heap ---Dijkstra算法的优化 BY Gremount

    Radix Heap 算法是在Dijkstra的Dial实现的基础上,通过减少对桶的使用,来优化算法的时间复杂度: Dial 时间复杂度是O(m+nC)     -------C是最长的链路 Radi ...