自定义解析

4.自定义解析

AutoMapper可以通过名称匹配等规则进行对象的映射,但是在实际的项目中,只是这样是远远不够的,比说我们需要名称不同的字段进行映射,或者需要再加一些逻辑处理。AutoMapper为此提供一种方案:自定义解析。

4.1示例

我们先对类Source中Value1和Value2进行求和运算,再映射到类Destination中Total。

public class Source
{
public int Value1 { get; set; }
public int Value2 { get; set; }
} public class Destination
{
public int Total { get; set; }
}

AutoMapper提供了接口IValueResolver实现自定义解析,其中包含有源类型,源对象,目标类型,目标对象等信息。

//IValueResolver接口
public interface IValueResolver<in TSource, in TDestination, TDestMember>
{
TDestMember Resolve(TSource source, TDestination destination, TDestMember destMember, ResolutionContext context);
}

在这里我们需要继承这个接口,就可以实现自定义解析。

//继承接口IValueResolver
/// <summary>
/// 自定义解析类
/// </summary>
public class CustomResolver : IValueResolver<Source, Destination, int>
{
/// <summary>
/// 自定义解析实现
/// </summary>
/// <param name="source">源对象</param>
/// <param name="destination">目标对象</param>
/// <param name="member"></param>
/// <param name="context"></param>
/// <returns></returns>
public int Resolve(Source source, Destination destination, int member, ResolutionContext context)
{
//逻辑处理 对Value1和Value2进行求和运算
return source.Value1 + source.Value2;
}
} //测试方法
[TestMethod]
public void CustomValResTest()
{
//初始化映射规则,并调用 CustomResolver自定义解析
Mapper.Initialize(cfg =>
cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.Total, opt => opt.ResolveUsing<CustomResolver>()));
Mapper.AssertConfigurationIsValid(); var source = new Source
{
Value1 = 5,
Value2 = 7
};
var result = Mapper.Map<Source, Destination>(source); Assert.AreEqual(12,result.Total); //测试通过
}

4.2根据源映射值解析

上一个示例中我们把源对象和目标对象当成参数传入,这样就降低了方法的重用性。我们可以把源对象和目标对象用Object代替,传入源对象的映射源值,这样可以对映射源值进行逻辑处理。

//继承接口 IMemberValueResolver
/// <summary>
/// 自定义解析类V2 根据源对象的源映射值解析
/// </summary>
public class CustomResolverV2 : IMemberValueResolver<object, object, int, int>
{
public int Resolve(object source, object destination, int sourceMember, int destinationMember, ResolutionContext context)
{
// logic here
return sourceMember * 2;
}
} //测试方法
[TestMethod]
public void CustomValResV2Test()
{
//初始化映射规则,
Mapper.Initialize(cfg =>
cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.Total, opt => opt.ResolveUsing<CustomResolverV2,int>(src=>src.Value1)));
//Mapper.AssertConfigurationIsValid();
var source = new Source
{
Value1 = 5,
//Value2 = 7
};
var result = Mapper.Map<Source, Destination>(source);
Assert.AreEqual(10, result.Total); //测试通过
}

AutoMapper之自定义解析的更多相关文章

  1. AutoMapper在MVC中的运用03-字典集合、枚举映射,自定义解析器

    本篇AutoMapper使用场景: ※ 源字典集合转换成目标字典集合 ※ 枚举映射 ※ 自定义解析器 ※ 源中的复杂属性和Get...方法转换成目标属性 源字典集合转换成目标字典集合 □ Domain ...

  2. 10.AutoMapper 之自定义值解析器(Custom Value Resolvers)

    https://www.jianshu.com/p/3e7cf1d1f17d 自定义值解析器(Custom Value Resolvers) 虽然AutoMapper涵盖了相当多的目标成员映射方案,但 ...

  3. 09.AutoMapper 之自定义类型转换器(Custom Type Converters)

    https://www.jianshu.com/p/47054d92db2a 自定义类型转换器(Custom Type Converters) 有时需要完全控制一种类型到另一种类型的转换.这一般发生在 ...

  4. Newtonsoft.Json 自定义 解析协议

    在开发web api的时候 遇到一个要把string未赋值默认为null的情况改成默认为空字符串的需求 这种情况就需要自定义json序列话的 解析协议了 Newtonsoft.Json默认的解析协议是 ...

  5. 深入解析QML引擎, 第4部分: 自定义解析器

    原文 QML Engine Internals, Part 4: Custom Parsers ——————————————————————————————————————————— 上一篇 绑定类型 ...

  6. pyparsing自定义解析规则

    1.Word(token) 用于匹配由允许的字符集组成的单词,常见的错误是使用特定字符串Word("expr")匹配"expr" - L {alphas}  字 ...

  7. AutoMapper源码解析

    研究AutoMapper源码前,我们先来看一下AutoMapper的作用 官网解释:AutoMapper是一个简单的小程序库,旨在解决看似复杂的问题-摆脱将一个对象映射到另一个对象的代码 解释 首先一 ...

  8. Gson实现自定义解析json格式

    客户端跟服务器交互的时候我们使用json实现 但是 在交互的时候除了传送json对象数据意外 我们还需要传输标志位等 比如我们现在的交互方式格式 对象 { "data": { &q ...

  9. JSON 串 自定义解析字段

    我们有时候会只需要j一个很长的json串中的少数的key value ,这个时候我们不会特意去建立一个object 来映射属性,这个时候我们可以应用 gson的JsonParser  来解析json串 ...

随机推荐

  1. Android-Java-Thread线程两种方式的使用场景

    Thread线程两种方式的优点/缺点 extends Thread 方式: 缺点:存在耦合度(因为线程任务run方法里面的业务逻辑 和 线程启动耦合了) 缺点:Cat extends Thread { ...

  2. [leetcode 120]triangle 空间O(n)算法

    1 题目 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjac ...

  3. [ASE][Daily Scrum]11.06

    我们的<坦克大战·无尽>正式开始动工了,今天的任务计划如下~ [Plan] View Shilin Liu 搭建好开发环境 收集素材         Control Jiafan Zhu ...

  4. [C# 面试总结]9个点如何画10条线

    问题描述 9个点画10条直线,要求每条直线上至少3个点,相信这道理题目很多朋友在面试的时候都遇到过的(同时自己在面试的时候也遇到过),所以这里记录下来以备复习. 解决方法1:

  5. 【VB6】全局键盘钩子

    基本也没啥好说的,不要用到木马及恶意程序中是以前从VB.NET程序改到VB6的,阉割了一些功能,只提供键盘Hook功能想要截获热键可以在处理函数中返回1,里面有示例 下载地址 http://pan.b ...

  6. net 把指定 URI 的资源下载到本地

    DirectoryInfo dir = new DirectoryInfo(AppContext.BaseDirectory); var path = dir.FullName + @"te ...

  7. JQuery - on绑定多个事件

    一.jquery为多个选择器绑定同一个事件 $("#start,#end").on("click",function(){ alert("The pa ...

  8. Python3.5 学习十九 Django分模块讲解 MTV+URL

    本节内容概述: 表单提交的Method使用规则:get 获取数据 post提交数据 单选使用get 多选使用getlist request.POST.getlist("favor" ...

  9. mybatis 插件原理

    [传送门]:mybatis 插件原理

  10. java项目配置域名(tomcat直接配置 or 使用nginx反向代理)

    一:  tomcat直接配置域名:https://blog.csdn.net/qq_36330228/article/details/78516160 二: 使用nginx进行反向代理 tomcat服 ...