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

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在这个项目中,有没有办法模仿呢?

i3a*_*non 6

好吧,你可以使用一个接收访问者委托的扩展方法,只有当项目不是时才执行它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()))或返回值类型的操作创建此方法的版本.

  • 为什么`TResult`必须是一个班级?如果你正在处理`Nullable <T>`这是一个`struct`怎么办? (2认同)
  • @Amy肯定..但它适用于每个级别.就像你需要为每个条件访问使用`?.`一样. (2认同)