自定义解析

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. Delphi中Unicode转中文

    function UnicodeToChinese(inputstr: string): string; var i: Integer; index: Integer; temp, top, last ...

  2. Python 中的深拷贝和浅拷贝

    一.浅拷贝python中 对象赋值时 默认是浅拷贝,满足如下规律:1. 对于 不可变对象(字符串,元组 等),赋值 实际上是创建一个新的对象:例如: >>> person=['nam ...

  3. css伪元素:before和:after用法详解

    css的伪元素,之所以被称为伪元素,是因为他们不是真正的页面元素,html没有对应的元素,但是其所有用法和表现行为与真正的页面元素一样,可以对其使用诸如页面元素一样的css样式,表面上看上去貌似是页面 ...

  4. 简单线性回归问题的优化(SGD)R语言

    本编博客继续分享简单的机器学习的R语言实现. 今天是关于简单的线性回归方程问题的优化问题 常用方法,我们会考虑随机梯度递降,好处是,我们不需要遍历数据集中的所有元素,这样可以大幅度的减少运算量. 具体 ...

  5. flask_ Mongodb 的语法-排序

    MOngoDB的排序是挺有用的   ,跟MySQL有明显的区别 .. 它的原生语法的第一个参数为条件限定,第二个参数为排序字段 db.news.find({},{'_id':1})   #1是升序  ...

  6. mysql添加类似oracle的伪列及查看表信息

    sql格式: AS rownum, table_name.* ) r, table_name; AS rownum, table_name.字段1, table_name.字段2, table_nam ...

  7. windows系统numpy的下载与安装教程

    numpy是一款基于python的功能强大的科学计算包.要安装numpy首先你得先安装python.python的安装非常简单,本人安装的是python3.4. 工具/原料 安装好的python程序 ...

  8. vue插件ele使用小坑

    1.ele-table组件中selection如何默认选中 使用官网提供的api-->>Table Methods中的toggleRowSelection,关于这个api基本介绍就不说了. ...

  9. 全网最详细的大数据集群环境下如何正确安装并配置多个不同版本的Cloudera Hue(图文详解)

    不多说,直接上干货! 为什么要写这么一篇博文呢? 是因为啊,对于Hue不同版本之间,其实,差异还是相对来说有点大的,具体,大家在使用的时候亲身体会就知道了,比如一些提示和界面. 全网最详细的大数据集群 ...

  10. CVPR2019 | Mask Scoring R-CNN 论文解读

    Mask Scoring R-CNN CVPR2019 | Mask Scoring R-CNN 论文解读 作者 | 文永亮 研究方向 | 目标检测.GAN 推荐理由: 本文解读的是一篇发表于CVPR ...