条件映射

条件映射 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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注