条件映射 Condition 与 PreCondition
AutoMapper 允许你为属性设置条件,只有满足条件时才会执行该属性的映射。
典型使用场景:例如把 int 映射到 unsigned int(无符号整型)。
class Foo{
public int baz;
}
class Bar {
public uint baz;
}Code language: PHP (php)
下面的映射配置,只有源对象的 baz 值大于等于 0 的时候,才会对 baz 属性执行映射。
Mapper.Initialize(cfg => {
cfg.CreateMap<Foo,Bar>()
.ForMember(dest => dest.baz, opt => opt.Condition(src => (src.baz >= 0)));
});Code language: JavaScript (javascript)
前置条件 PreCondition
还有一个 PreCondition 方法,二者存在执行时机的区别:PreCondition 在解析源值之前执行,执行时机更早(适用于搭配 MapFrom 等场景)。
执行顺序:PreCondition → 解析得到映射的源值 → Condition 判断 → 给目标属性赋值。
using AutoMapper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Mapper.Initialize(cfg => {
cfg.CreateMap<Foo, Bar>()
.ForMember(dest => dest.baz, opt => opt.Condition(src => (src.baz >= 0)));
});
//条件符合的
var f = new Foo() { baz = 1 };
var d = Mapper.Map<Bar>(f);
//条件不符合的
var f2 = new Foo() { baz = -1 };
var d2 = Mapper.Map<Bar>(f2);//抛出异常 AutoMapper.AutoMapperMappingException:“Error mapping types.”
Console.ReadKey();
}
}
class Foo
{
public int baz;
}
class Bar
{
public uint baz;
}
}Code language: JavaScript (javascript)