Aym*_*udi 5 .net c# c#-5.0 c#-6.0
我有一种情况需要在对象初始化程序中分配一些对象的属性.其中一些对象可以为null,我需要访问它们的属性,问题是它们太多了,使用if/else的东西并不好.
例
visits = visitJoins.AsEnumerable().Select(joined => new VisitPDV()
{
VisiteId = joined.Visite.VisiteId.ToString(),
NomPointDeVente = joined.VisitePdvProduit.PointDeVente.NomPointDeVente,
});
Run Code Online (Sandbox Code Playgroud)
在joined.VisitePdvProduit可以为空,而问题是,有像几十个这样的任务的(我只是把一个缩短的代码)
C# 6 Null-Conditional operator对于这种情况来说,这是完美的解决方案,问题是我C# 5在这个项目中,有没有办法模仿呢?
好吧,你可以使用一个接收访问者委托的扩展方法,只有当项目不是时才执行它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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用它,例如:
NomPointDeVente = joined.VisitePdvProduit.ConditionalAccess(_ => _.PointDeVente.NomPointDeVente);
Run Code Online (Sandbox Code Playgroud)
您可以轻松地为不返回值(即bar.ConditionalAccess(_ => _.Foo()))或返回值类型的操作创建此方法的版本.