/// <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. PHP 创建 MySQL 表

    CREATE TABLE 语句用于创建 MySQL 表. 创建表前,我们需要使用 use myDB 来选择要操作的数据库: use myDB; 我们将创建一个名为 "MyGuests&quo ...

  2. 007_项目制作拍摄视频篇之_《基于ARM与ZigBee的实验室签到系统》

    研究的背景和意义: 随着社会生活节奏的加快,科技日新月异,信息更新迅速,人们之间的交流也变得越来越频繁,社会群体乃至政府之间的交流也朝着轻松.快速.容易管理和控制的方向发展,这种信息交流方式已经逐步得 ...

  3. luogu P3709 大爷的字符串题

    二次联通门 : luogu P3709 大爷的字符串题 /* luogu P3709 大爷的字符串题 莫队 看了半天题目 + 题解 才弄懂了要求什么... 维护两个数组 一个记录数字i出现了几次 一个 ...

  4. VsCode安装Go的相关插件

    今天在学习Go的时候,安装Go的相关插件,显示安装不上,但是右下角也一直会提示让你安装,当然你可以设置成忽略,为了开发效率,我选择了安装.然后出现了问题,一直Failed.在网上看到了很多的文章,不是 ...

  5. 6、transformation和action1

    一.transformation和action入门 1.介绍 Spark支持两种RDD操作:transformation和action.transformation操作会针对已有的RDD创建一个新的R ...

  6. Kalman实际应用总结

    目录 Kalman理论介绍 一. 简单理论介绍理论 二. 升华理论介绍 Kalman基本应用 一. Kalman跟踪/滤波 二. Kalman预测/融合(单传感器) 三. Kalman多传感器融合A ...

  7. mysql 修改表结构以支持事务操作

    修改表的类型为 INNODB 的 SQL: alter table category_ ENGINE = innodb;     查看表的类型的 SQL show table status from ...

  8. SpringMVC 捕获参数绑定失败时的异常

    SpringMVC配置数据验证(JSR-303)中提到了用String类型的域来绑定Ajax中的非法类型的参数. 这样做的目的是一旦发生一种情况,后端可以返回一个自定类的返回值,而不是返回Spring ...

  9. 搜索sqlserver 存储过程中的关键字

    搜索sqlserver 存储过程中的关键字 select * from sys.all_sql_modules where definition like '%SP_NAME%'

  10. Mininet系列实验(一):Mininet使用源码安装

    1 实验目的 掌握Mininet使用源码安装的方法. 2 实验原理 Mininet 是一个轻量级软件定义网络和测试平台:它采用轻量级的虚拟化技术使一个单一的系统看起来像一个完整的网络运行相关的内核系统 ...