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)就是数据传输对象,说 ...
随机推荐
- C#与Java的比较
C#与Java的比较 写完后得知维基百科里有更加全面得多的比较: http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java NET(C#) ...
- 通用Hibernate DAO类(包括分页)
package com.jronline.dao; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.S ...
- DWT小波变换及其在时间序列数据预测中的应用
Given data: 时间序列数据. Goal:做预测 方法:在滑动窗口中取DWT特征,并验证. 实验验证: Load forcast 数据集. 问题: 小波变换的物理意义是什么? 小波变换的数学意 ...
- FastReport 中添加二维码功能.(Delphi)
http://www.cnblogs.com/fancycloud/archive/2011/07/24/2115240.html FastReport 中添加二维码功能.(Delphi) 在实际 ...
- IDEA工具使用说明
IDEA使用说明 1.安装 2.开始界面 1)create New Project (新建项目) 2)Import Project (导入项目) 3)Open (打开已有的项目) 4)Check o ...
- Android_demo之生成二维码
今天我们来学习一个自动生成二维码 的写法.我们经常能见到各种二维码,比如公众号的二维码,网址的,加好友的,支付的二维码等等.其实每一个二维码只是利用图片的形式展示出来的,实际是一些字符串.而这个字符串 ...
- wpf 遮住输入法 问题
可以参考这个代码 http://www.cnblogs.com/Leaco/p/3164394.html 当你发现没用的时候 可以改这句代码 var hwnd = ((HwndSource)Pr ...
- MongoDB Replica Set 选举过程
什么是选举? 选举是副本集选择某个成员成为primary的过程.primary是一个副本集中唯一能够接收写操作的成员. 下面的事件能够引发一次选举: 第一次初始化一个副本集 Primary失效.rep ...
- UML(统一建模语言)
需求分析阶段 用例图 定义:用例图并不是用来描述用例的.用例图的主要作用是:直观地描述系统对外提供的功能. 用例图的三个要素:角色.系统.用例 用例图的关系: 角色和用例的关系:有关和无关 用例和用例 ...
- 微软2016校园招聘4月在线笔试 A FontSize
题目链接:http://hihocoder.com/problemset/problem/1288 分析:题目中所求的是最大的FontSize(记为S),其应该满足P*[W/S]*[H/S] > ...