自动映射:取消引用可能为空的引用吗?空条件运算符不适用于自动映射

时间:2019-12-26 16:22:17

标签: c# automapper

我正在为类AB使用AutoMapper。该项目是具有<Nullable>enabled</Nullable>的.Net核心项目。

public class A 
{
    public ClassX? X { get; set; } // ClassX is a custom class with the property of Value.
    //.... 
}

public class B 
{
    public string? X { get; set; } 
   // ....
}

在以下映射代码中

public void Mapping(Profile profile)
{
    // ....

    _ = profile?.CreateMap<A, B>()
        .ForMember(d => d.X, o => o.MapFrom(s => s.X.Value)); // warning on s.X
}

它在s.X上显示以下警告:

  

警告CS8602取消引用可能为空的引用。

如何在不使用#pragma warning disable CS8602的情况下摆脱警告?

我尝试使用空条件将o.MapFrom(s => s.X.Value)更改为o.MapFrom(s => s.X?.Value)。但是它在s.X?.Value上出现以下错误

  

错误CS8072,表达式树lambda不能包含空传播运算符

1 个答案:

答案 0 :(得分:4)

由于MapFrom接受Expression<>而不是Func<>,因此不能使用Null条件运算符。这不是AutoMapper的限制,它是System.Linq.Expressions命名空间中的表达式树和C#编译器的限制。

但是,您可以使用三元运算符:

_ = profile?.CreateMap<A, B>()
    .ForMember(d => d.X, o => o.MapFrom(s => s.X == null ? null : s.X.Value));

根据您的声明,属性X可为空。因此,必须确保它为null时不会被取消引用。

(根据@Attersson)如果要在null情况下分配其他值,则可以将null-coalescing运算符与三元运算符结合使用:

(s.X == null ? null : s.X.Value) ?? someDefaultValue