首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AutoMapping:删除可能为空的引用?空条件运算符不适用于AutoMapping

AutoMapping:删除可能为空的引用?空条件运算符不适用于AutoMapping
EN

Stack Overflow用户
提问于 2019-12-26 16:22:17
回答 1查看 2.6K关注 0票数 3

我将AutoMapper用于AB类。该项目是一个带有.Net的<Nullable>enabled</Nullable>核心项目。

代码语言:javascript
复制
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; } 
   // ....
}

在下列映射代码中

代码语言:javascript
复制
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消除警告

我尝试使用Null条件将o.MapFrom(s => s.X.Value)更改为o.MapFrom(s => s.X?.Value)。但是它在上得到了下面的错误。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-26 16:28:32

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

但是,可以使用三元操作符:

代码语言:javascript
复制
_ = profile?.CreateMap<A, B>()
    .ForMember(d => d.X, o => o.MapFrom(s => s.X == null ? null : s.X.Value));

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

(根据@Attersson),如果要在空情况下赋值不同的值,可以结合三元运算符使用空合并运算符:

代码语言:javascript
复制
(s.X == null ? someDefaultValue : s.X.Value)

// e.g for string
(s.Text == null ? String.Empty : s.Text)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59490921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档