有没有办法在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解决方案,我只是为了完整性而提到它。
上述就是C#学习教程:有没有办法在C#5中模仿C#6 Null-Conditional运算符分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/948989.html