/// <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. 服务器nginx部署PHP项目样式不出来要注意的小问题

    服务器使用nginx部署PHP项目的时候如果样式没有 出来,那么很可能 location 块里出问题了. 比如 location / { root /home/wwwroot/default/php_ ...

  2. Oracle 修改SID --不建议修改

    1.登录数据库查看SID select instance_name,status from v$instance; 2.关闭数据库 shutdown immdiate; 3.修改/etc/oratab ...

  3. ROS中make_plan服务的使用

    路径规划:从一个点到另一个点,规划出最优的路线.用到service :make_plan (nav_msgs/GetPlan) 服务名为move_base_node/make_plan nav_msg ...

  4. for循环实战性能优化

    完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的.今天就来说一下java代码优化的事情,今天主要聊一下对于for(wh ...

  5. ios兼容

    border-radius在ios的兼容:-webkit-appearance:none;  加上这个属性,可以保证安卓和ios的圆角一致 上传图片,这段没有代码没有管图片拍摄的方位, var _th ...

  6. Nginx之URL重写(rewrite)配置

    Nginx URL重写(rewrite)配置及信息详解1)if判断指令 语法为if(condition){…}     #对给定的条件condition进行判断.如果为真,大括号内的rewrite指令 ...

  7. Telegraf+Influxdb+Grafana(Windows下本机简易监控系统搭建)

    1.文件名称 telegraf-1.5.0_windows_amd64.zip influxdb-1.4.2_windows_amd64.zip grafana-4.6.3.windows-x64.z ...

  8. [Linux] pwm设备驱动调试

    转载请注明出处:https://www.cnblogs.com/lialong1st/p/11436190.html CPU:RK3288 系统:Linux 客户需求是通过 pwm 控制激光的强弱,写 ...

  9. arcgis python 表属性转html

    import arcpy import sys import string import os tablePath = arcpy.GetParameterAsText(0) filePath = a ...

  10. THINKPHP扩展PHPEXCEL,PHP7.2以上版本无法导出Excel

     THINKPHP扩展PHPEXCEL与PHP7.3高版本兼容问题 框架:THINKPHP5,PHPEXCEL版本:1.81 无法导出EXCEL原因为Shared/OLE.php第290行使用cont ...