【簡介】: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(); } }
這樣經過值解析器就能計算出內存的總大小了。