/// <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. 引入其他服务器的JS文件,同时也引入本地JS文件 报错时:

    控制台报错: Uncaught ReferenceError: define is not defined at core.js:5

  2. 使用quickstart方式快速搭建maven工程

    通常idea 创建maven工程,初始化会比较慢,针对这种现象.我们可以使用一些巧妙的方式来帮助快速搭建 废话不多说直接上图! 图1 使用 archetype-quickstart  选择 图二 点击 ...

  3. DOM操作2

    一.API和WebAPI API就是接口,就是通道,负责一个程序和其他软件的沟通,本质是预先定义的函数. Web API是网络应用程序接口.包含了广泛的功能,网络应用通过API接口,可以实现存储服务. ...

  4. [bzoj 3534][Sdoi2014] 重建

    传送门 Description  T国有N个城市,用若干双向道路连接.一对城市之间至多存在一条道路. 在一次洪水之后,一些道路受损无法通行.虽然已经有人开始调查道路的损毁情况,但直到现在几乎没有消息传 ...

  5. 小程序开发--WePy框架

    现如今mvvm框架如此火热,其核心思想即js逻辑层不直接操作DOM,只改变组件状态:而视图层则通过模板template进行渲染. 1.WePy项目的目录结构 ├── dist 小程序运行代码目录 ├─ ...

  6. hive on tez

    hive运行模式 hive on mapreduce 离线计算(默认) hive on tez  YARN之上支持DAG作业的计算框架 hive on spark 内存计算 hive on tez T ...

  7. hello world&Restart the Journey

      一个女OIer. 总结,游记,集训日志在博客园:题解大多在洛谷. 洛谷博客点这里. $\texttt{ You can go on,just take me with you.}$ 可以叫我Har ...

  8. scp执行报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

    linux环境执行scp时会遇到报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!,如下 [root@subsname home]# scp AAA. ...

  9. 配置mysql远程访问

    参考: https://www.cnblogs.com/sanduzxcvbnm/p/9789236.html

  10. Fences_3.08破解安装

    Fences_3.08破解安装 一.总结 一句话总结: 找破解软件去吾爱破解论坛,非常节约时间 二.Fences_3.08破解安装(亲测有效) 来源:吾爱破解论坛 百度网盘下载地址:链接:https: ...