有没有办法在 C# 5 中模仿 C# 6 空条件运算符

Is there a way to Imitate C# 6 Null-Conditional operator in C# 5

我有一种情况需要在对象初始值设定项中分配一些对象的属性。其中一些对象可以为空,我需要访问它们的属性,问题是它们太多了,使用 if/else 并不好。

例子

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

joined.VisitePdvProduit可以为null,问题是这样的赋值有几十个(我只拿了一个来缩短代码)

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

像这样。丑陋,但不得不做的事情。

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

如果你说的是半很惊讶运算符?.,那么没有。无法模仿语法。

不过,您可以创建一个扩展方法(或辅助方法,最好是静态方法)或使用属性的实例方法。

或者,正如有人建议的那样,只使用条件语句(内联或显式)。但这当然不是您要找的。

另一种方法(根本不 推荐)是用 try-catch 包围作业。但那是 非常糟糕的 解决方案,我只是为了完整起见才提到它。

好吧,您可以使用一种扩展方法来接收访问器委托,并且仅在项目不是 null:

时才执行它
public static TResult ConditionalAccess<TItem, TResult>(this TItem item, Func<TItem, TResult> accessor) where TResult : Class
{
    if (item == null)
    {
        return null;
    }
    else
    {
        return accessor(item);
    }
}

你可以像这样使用它:

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

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