AutoMapper扩展
扩展类:AutoMapExtention
using System;
using System.Collections.Generic;
using System.Linq.Expressions; namespace AutoMapper.Extention
{
public static class AutoMapExtention
{
/// <summary>
/// 类型映射
/// </summary>
/// <typeparam name="F">From</typeparam>
/// <typeparam name="T">To</typeparam>
/// <param name="source"></param>
/// <returns></returns>
public static T MapTo<F, T>(this F source,
Func<Dictionary<Expression<Func<T, object>>, Action<IMemberConfigurationExpression<F>>>> mapRuleSets = null,
bool ignoreNull = false)
where T : class
where F : class
{
if (source == null) { return default(T); }
var m = Mapper.CreateMap<F, T>();
if (ignoreNull)
{
m.ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
}
if (mapRuleSets != null)
{
var arr = mapRuleSets();
foreach (var item in arr)
{
m.ForMember(item.Key, item.Value);
}
}
return Mapper.Map<T>(source);
} /// <summary>
/// 集合映射
/// </summary>
/// <typeparam name="F"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <param name="defaultValueSets">默认值</param>
/// <param name="mapRuleSets">映射规则</param>
/// <returns></returns>
public static List<T> MapTo<F, T>(this IEnumerable<F> source,
Func<Dictionary<Expression<Func<T, object>>, Action<IMemberConfigurationExpression<F>>>> mapRuleSets = null,
bool ignoreNull = false)
where T : class
where F : class
{
if (source == null) { return new List<T> { }; }
var m = Mapper.CreateMap<F, T>();
if (ignoreNull)
{
m.ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));
}
if (mapRuleSets != null)
{
var arr = mapRuleSets();
foreach (var item in arr)
{
m.ForMember(item.Key, item.Value);
}
}
return Mapper.Map<List<T>>(source);
}
}
}
实体模型:
using System; namespace UnitTests.Model.OOMapper
{
public class User
{
public Guid ID { get; set; }
public int? SerialNumber { get; set; }
public string RealName { get; set; }
public bool Sex { get; set; }
}
}
using System; namespace UnitTests.Model.OOMapper
{
public partial class UserDTO
{
public Guid ID { get; set; }
public int? SerialNumber { get; set; }
public string RealName { get; set; }
public bool Sex { get; set; }
}
}
测试
using Microsoft.VisualStudio.TestTools.UnitTesting;
using AutoMapper.Extention;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnitTests.Model.OOMapper;
using System.Linq.Expressions;
using AutoMapper; namespace UnitTests.Tests
{
[TestClass()]
public class OOMapperTests
{
[TestMethod()]
public void MapToTest()
{
var user = new User()
{
ID = Guid.NewGuid(),
Sex = true,
RealName = "陈楚生",
SerialNumber =
};
//单体映射
var userDTO = user.MapTo<User, UserDTO>(() =>
{
var rules = new Dictionary<Expression<Func<UserDTO, object>>, Action<IMemberConfigurationExpression<User>>>();
rules.Add(dst => dst.RealName, opt => opt.MapFrom(src => string.Format("Hello,{0}", src.RealName)));
return rules;
});
//集合映射
List<User> users = new List<User>() { user };
var userDTOs = users.MapTo<User, UserDTO>(() =>
{
var rules = new Dictionary<Expression<Func<UserDTO, object>>, Action<IMemberConfigurationExpression<User>>>();
rules.Add(dst => dst.RealName, opt => opt.MapFrom(src => string.Format("Hello,{0}", src.RealName)));
return rules;
});
Assert.IsTrue(user.ID == userDTO.ID && users.Count == userDTOs.Count);
}
}
}
AutoMapper扩展的更多相关文章
- AutoMapper扩展帮助类
/// <summary> /// AutoMapper扩展帮助类 /// </summary> public static class AutoMapperExtension ...
- Automapper扩展方法
问题描述 系统中实现了一个自定义的PagedList /// <summary> /// Paged list interface /// </summary> public ...
- Abp.AutoMapper扩展(1) --static class AutoMapExtensions
// 摘要: // Converts an object to another using AutoMapper library. Creates a new object ...
- Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)
Asp.net 面向接口可扩展框架的“类型转化基础服务”是我认为除了“核心容器”之外最为重要的组成部分 但是前面博文一出,争议很多,为此我再写一篇类型转化基础服务和各种Mapper结合的例子,顺便对各 ...
- EF架构~对AutoMapper实体映射的扩展
回到目录 AutoMapper在之前我曾经介绍过,今天主要是把它作一下扩展,因为它的调用太麻烦了,呵呵,扩展之后,用着还可以,感觉.net3.5之后,有了扩展方法这个东西,在程序开发速度及表现力上都有 ...
- AutoMapper 6.x 扩展方法
简介 很多时候我们使用AutoMapper的时候,都需要进行一个配置才可以使用Mapper.Map<Source,Target>(entity);.如果不进行配置则会报错. 如果实体过多, ...
- 从我做起[AutoMapper实现模块化注册自定义扩展MapTo<>()].Net Core 之二
AutoMapper实现模块化注册自定义扩展MapTo<>() 我们都知道AutoMapper是使用的最多的实体模型映射,如果没有AutoMapper做对象映射那么我们需要想一下是怎么写的 ...
- AutoMapper随笔记
平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先看效果:(完整Demo:https://git ...
- 让AutoMapper在你的项目里飞一会儿(转)
出处:http://www.cnblogs.com/WeiGe/p/3835523.html 先说说DTO DTO是个什么东东? DTO(Data Transfer Object)就是数据传输对象,说 ...
随机推荐
- [转载]Js小技巧||给input type=“password”的输入框赋默认值
http://www.cnblogs.com/Raywang80s/archive/2012/12/06/2804459.html [转载]Js小技巧||给input type="passw ...
- range()和xrange()区别
版本:Python2.7 1.先看帮助说明 (1)range()返回一个递增或递减的数字列表,列表的元素由三个参数决定 start 表示列表开始的值,默认为0 stop 表示列 ...
- ubuntu 安装mysql-python和 python-ldap,navicate 问题
1.Ubuntu 下 pip install mysql-python 报错 EnvironmentError: mysql_config not found 原因是缺少mysqlclient 包,执 ...
- Java 对文件的读取操作
package pack; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
- 初学c# -- 学习笔记(五) winfrom自定义滚动条
找了些例子,要么庞大.要么搞个安装组件什么的,我要求能用就行了.实在找例子修改麻烦,就做了一个.其实实现挺简单,就是panel或图片什么的跟着鼠标走就行了. 这里panel自己可以加背景图或直接搞个图 ...
- oracle 数据库学习3 --oracle 数据库中常使用的函数
1.字符函数: ASCII(X) -->返回X字符的ASCII码 concat(x,y)-->将y连接到X上输出 select concat(first_name,last_name) f ...
- div显示提示信息
div显示提示信息 <body> <style type="text/css"> a.link{position:relative;} a.link div ...
- ceph与openstack对接
对接分为三种,也就是存储为openstack提供的三类功能1.云盘,就好比我们新加的硬盘2.原本的镜像也放在ceph里,但是我没有选择这种方式,原因是因为后期有要求,但是我会把这个也写出来,大家自己对 ...
- C# 科学计数法转换成数字
/// <summary> /// 判断输入的数是否是科学计数法.如果是的话,就会将其换算成整数并且返回,否则就返回false. /// </summary> /// < ...
- GridLayout自定义数字键盘(两个EditText)
功能说明: 适用于两个EditText输入框,并控制输入字符的长度,点击键盘中的"确定"按钮完成输入,点击"前一项"光标跳到前一个EditText 运行效果图如 ...