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

我有一种情况需要在对象初始化程序中分配一些对象的属性。 其中一些对象可以为null,我需要访问它们的属性,问题是它们太多了,使用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上,有没有办法模仿呢?

好吧,您可以使用一个接收访问者委托的扩展方法,只有在该项不为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()) )或返回值类型创建此方法的版本。

像这样。 丑陋,但必须做什么。

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

如果你在谈论半非常惊讶的运营商 , 那就不要。 没有办法模仿语法。

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

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

另一种方法(并且根本推荐)是使用try-catch包围赋值。 但这确实是baaad解决方案,我只是为了完整性而提到它。