扩展类: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扩展的更多相关文章

  1. AutoMapper扩展帮助类

    /// <summary> /// AutoMapper扩展帮助类 /// </summary> public static class AutoMapperExtension ...

  2. Automapper扩展方法

    问题描述 系统中实现了一个自定义的PagedList /// <summary> /// Paged list interface /// </summary> public ...

  3. Abp.AutoMapper扩展(1) --static class AutoMapExtensions

    // 摘要:        //     Converts an object to another using AutoMapper library. Creates a new object    ...

  4. Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)

    Asp.net 面向接口可扩展框架的“类型转化基础服务”是我认为除了“核心容器”之外最为重要的组成部分 但是前面博文一出,争议很多,为此我再写一篇类型转化基础服务和各种Mapper结合的例子,顺便对各 ...

  5. EF架构~对AutoMapper实体映射的扩展

    回到目录 AutoMapper在之前我曾经介绍过,今天主要是把它作一下扩展,因为它的调用太麻烦了,呵呵,扩展之后,用着还可以,感觉.net3.5之后,有了扩展方法这个东西,在程序开发速度及表现力上都有 ...

  6. AutoMapper 6.x 扩展方法

    简介 很多时候我们使用AutoMapper的时候,都需要进行一个配置才可以使用Mapper.Map<Source,Target>(entity);.如果不进行配置则会报错. 如果实体过多, ...

  7. 从我做起[AutoMapper实现模块化注册自定义扩展MapTo<>()].Net Core 之二

    AutoMapper实现模块化注册自定义扩展MapTo<>() 我们都知道AutoMapper是使用的最多的实体模型映射,如果没有AutoMapper做对象映射那么我们需要想一下是怎么写的 ...

  8. AutoMapper随笔记

    平台之大势何人能挡? 带着你的Net飞奔吧! http://www.cnblogs.com/dunitian/p/4822808.html#skill 先看效果:(完整Demo:https://git ...

  9. 让AutoMapper在你的项目里飞一会儿(转)

    出处:http://www.cnblogs.com/WeiGe/p/3835523.html 先说说DTO DTO是个什么东东? DTO(Data Transfer Object)就是数据传输对象,说 ...

随机推荐

  1. Elasticsearch相关资源

    安装介绍 http://www.doc88.com/p-171165797348.html 入门教程 http://www.iteye.com/blogs/subjects/elasticsearch ...

  2. C# POST请求

    public string PostWebRequest(string postUrl, string paramData, Encoding dataEncode) { string ret = s ...

  3. Xcode Pod使用

    安装pod  略.. 打开终端 cd  项目路径  (可以在xocde里项目右键show in Finder  讲工程目录拖入终端) 回车 vim podfile 回车 输入 :wq 保存 建立pod ...

  4. Android菜鸟成长记8 -- 布局实践(微信界面的编写)

    前面我们简单的介绍了一下android的五大布局,那么现在我们来实践一下,写一个简单的微信界面 首先,我们新建一个weixin.xml的linnerlayout布局 我们日常使用的微信,从简单的方面来 ...

  5. 获取项目中文件,存放到Debug中。

    说起这个,还真是费了一般功夫. 说个最简单的方法: 第一步:把需要生成到Debug中的文件放到项目中(注意:当前文件夹目录是什么样的,存放到Debug中也是什么样) 第二部:设置文件属性中 复制到输出 ...

  6. 【POJ2778】DNA Sequence(AC自动机,DP)

    题意: 生物课上我们学到,DNA序列中只有A, C, T和G四种片段. 经科学发现,DNA序列中,包含某些片段会产生不好的基因,如片段"ATC"是不好片段,则"AGATC ...

  7. js event 事件冒泡和事件捕获详细介绍

    . 参考: http://www.jb51.net/article/42492.htm 图: 假设一个元素div,它有一个下级元素p.<div> <p>元素</p> ...

  8. 1_UILabel

    // // ViewController.swift // 1_UILabel // // Created by Larry on 2016/12/7. // Copyright © 2016年 nf ...

  9. gcd 最小公约数

    int gcd(int a, int b) { ? a : gcd(b, a % b); }

  10. Activity之间传递参数(三)

    ------siwuxie095 传递值对象,即自定义的有数据类型的对象 1.首先 new 一个 class:User,用于创建自定义对象,同时右键 Generate 出 Constructor.se ...