当前位置:  开发笔记 > 编程语言 > 正文

有没有办法在C#5中模仿C#6 Null-Conditional运算符

如何解决《有没有办法在C#5中模仿C#6Null-Conditional运算符》经验,为你挑选了1个好方法。

我有一种情况需要在对象初始化程序中分配一些对象的属性.其中一些对象可以为null,我需要访问它们的属性,问题是它们太多了,使用if/else的东西并不好.

visits = visitJoins.AsEnumerable().Select(joined => new VisitPDV()
{
    VisiteId = joined.Visite.VisiteId.ToString(),
    NomPointDeVente = joined.VisitePdvProduit.PointDeVente.NomPointDeVente,             
});

joined.VisitePdvProduit可以为空,而问题是,有像几十个这样的任务的(我只是把一个缩短的代码)

C# 6 Null-Conditional operator对于这种情况来说,这是完美的解决方案,问题是我C# 5在这个项目中,有没有办法模仿呢?



1> i3arnon..:

好吧,你可以使用一个接收访问者委托的扩展方法,只有当项目不是时才执行它null:

public static TResult ConditionalAccess(this TItem item, Func accessor) where TResult : Class
{
    if (item == null)
    {
        return null;
    }
    else
    {
        return accessor(item);
    }
}

您可以使用它,例如:

NomPointDeVente = joined.VisitePdvProduit.ConditionalAccess(_ => _.PointDeVente.NomPointDeVente);

您可以轻松地为不返回值(即bar.ConditionalAccess(_ => _.Foo()))或返回值类型的操作创建此方法的版本.


为什么`TResult`必须是一个班级?如果你正在处理`Nullable `这是一个`struct`怎么办?
@Amy肯定..但它适用于每个级别.就像你需要为每个条件访问使用`?.`一样.
推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有