【简介】:html
虽然AutoMapper已经覆盖了大部分的映射场景,可是还有1%~5%的状况须要值解析器的帮助。app
不少时候,值解析器实现的功能能够直接在实体层经过逻辑代码直接实现,然而,若是这种逻辑只是映射时须要,这就会混乱咱们的源类型以及带来没必要要的操做。ide
这种状况下,AutoMapper容许成员配置自定义值解析器以达到想要的效果。spa
【示例】3d
接上例:【AutoMapper基础】简单示例--Flatenningcode
若是computer中有多个InternalMemory,那么在ComputerMainInfo中要取得InternalMemorySize时就须要将全部的InternalMemory的Size相加。htm
【类图】blog
【Code】内存
Computer:get
public class Computer { public string Name { get; set; } public double Price { get; set; } public DateTime ProduceDate { get; set; } public CPU CPU { get; set; } public List<InternalMemory> InternalMemories { get; set; } public Monitor Monitor { get; set; } }
值解析器CustomResolver:
public class CustomResolver : ValueResolver<Computer, double> { protected override double ResolveCore(Computer source) { double totalSize = 0.0; foreach (var item in source.InternalMemories) { totalSize += item.Size; } return totalSize; } }
Program:
class Program { static void Main(string[] args) { Computer computer = new Computer() { Name = "联想Y450", Price = 5199.00, ProduceDate = new DateTime(2009, 10, 10), CPU = new CPU() { MainFrequency = 2.2, ModelName = "Core T6600", ProducerName = "Intel" }, InternalMemories = new List<InternalMemory>(){ new InternalMemory() { Frequency = 1333, ModelName = "DDR3", ProducerName = "尔必达", Size = 4.0 }, new InternalMemory() { Frequency = 1333, ModelName = "DDR3", ProducerName = "尔必达", Size = 4.0 } }, Monitor = new Monitor() { ProducerName = "LG", Size = 14.0 } }; // 添加值解析器映射 AutoMapper.Mapper.CreateMap<Computer, ComputerMainInfo>().ForMember(dest => dest.InternalMemorySize, opt => opt.ResolveUsing<CustomResolver>() ); ComputerMainInfo computerMainInfo = AutoMapper.Mapper.Map<Computer, ComputerMainInfo>(computer); Console.WriteLine(computerMainInfo.CPUModelName); Console.WriteLine(computerMainInfo.InternalMemorySize); Console.Read(); } }
这样经过值解析器就能计算出内存的总大小了。