/// <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 数据类型

    MySQL 数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型. 数值类型 MySQL支持所有标准S ...

  2. URL中的String参数问题

    测试一个查询数据的接口,类似这样的URL:.../search?type=Astring,在浏览器中输入URL获取到的数据为空,但通过其它方式确认数据库中确实已有数据,怀疑是接口实现问题.找接口实现的 ...

  3. PHP 多维数组 根据字段排序

    这个太常用了,记录下.方便后面用 /** * @param $arr [要排序的数组] * @param $condition [要排序的条件, for array('id'=>SORT_DES ...

  4. 【原创】go语言学习(十九)测试用例

    目录 单元测试 压力测试 Go test命令介绍 单元测试 1.自动化测试框架 testingA. testing包提供了自动化测试相关的框架B. 支持单元测试和压力测试 import ( “test ...

  5. 如果对方网站反爬取,封IP了怎么办?

    放慢抓取熟速度,减小对目标网站造成的压力,但是这样会减少单位时间内的数据抓取量 使用代理IP(免费的可能不稳定,收费的可能不划算)

  6. Python geometry_msgs.msg.PoseStamped() Examples

    https://www.programcreek.com/python/example/70252/geometry_msgs.msg.PoseStampedhttps://programtalk.c ...

  7. Spring - 环境安装

    安装IDEA的非Community版本和Java的包之后就可以用Java来HelloWorld了. 然后去这个链接:https://github.com/spring-guides/gs-rest-s ...

  8. 史上最好用的依赖注入框架Google Guice【转】

    Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC).Guice非常小而且快. (其他的依赖注入框架还有Dagger,Spring) Spring ...

  9. POI2010 Bridges

    好题\(Q\omega Q\) 我们考虑这个东西要求最大值最小,显然一眼二分答案对吧. 问题在于如何\(check\),我们二分答案之后把问题转换成了混合图如何求欧拉回路. 考虑欧拉回路的性质,每一个 ...

  10. MAC常用快捷键 基本常用的都整理在这里了

    写在前面Mac系统中有几个比较特殊的功能键,和Win系统的区别也主要在这里比如在Win系统中我们常用的Ctrl键,在Mac系统中对应的不是长得比较像的Cnotrol,而是Command键,貌似也是Ma ...