我有一种情况需要在对象初始化程序中分配一些对象的属性.其中一些对象可以为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
在这个项目中,有没有办法模仿呢?
好吧,你可以使用一个接收访问者委托的扩展方法,只有当项目不是时才执行它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())
)或返回值类型的操作创建此方法的版本.