AutoMapper: 如何在值类型为 NULL 时进行映射

在使用 AutoMapper 进行对象映射时,默认情况下,当源对象的属性为 NULL 时,该属性不会被映射到目标对象。这对于引用类型来说通常是合理的,但对于值类型来说,可能会导致一些问题。

问题: 当源对象的值类型属性为 NULL 时,如何让它映射到目标对象?

解决方案: 使用 Nullable<T> 类型可以解决这个问题。Nullable<T> 是一个可空的值类型,它可以表示值类型的正常范围,以及一个额外的 NULL 值。

示例:

假设 SaveMaterialDto 中的某个值类型属性为 nullable 类型,我们可以将 Ignore 配置更改为如下所示:

CreateMap<SaveMaterialDto, Material>()
    .Ignore(x => x.Id)
    .ForAllMembers(opt => opt.Condition((src, dest, srcMember, destMember, context) =>
    {
        if (srcMember == null)
        {
            return false; // 不进行映射
        }

        // 检查值类型属性是否为 nullable 类型
        var isNullableType = Nullable.GetUnderlyingType(destMember?.MemberType) != null;
        if (isNullableType)
        {
            return true; // 进行映射
        }

        // 非 nullable 类型,检查值是否为 null
        return srcMember != null && srcMember.GetType().IsValueType;
    }));

解释:

  • 使用 Condition 方法来控制映射条件。
  • 当源属性为 NULL 时,直接返回 false,不进行映射。
  • 使用 Nullable.GetUnderlyingType 方法判断值类型属性是否为 nullable 类型。
  • 如果是 nullable 类型,则进行映射。
  • 如果不是 nullable 类型,则只有当值不为 NULL 时才会进行映射。

通过这种配置,我们就可以在值类型为 NULL 时进行映射,从而避免了由于值类型为 NULL 而导致的映射问题。

AutoMapper: 如何在值类型为 NULL 时进行映射

原文地址: https://www.cveoy.top/t/topic/qlAn 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录