我正在为类A
和B
使用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不能包含空传播运算符
答案 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