C# 测试父对象是否存在

C# 测试父对象是否存在,c#,.net,null-check,C#,.net,Null Check,我在项目中使用了大量数据库数据,这些数据以不同的类导出。例如,我有 transaction.Layout.Multimedia.Images.first(); 问题是这些属性不一定可用 因此,transaction.Layout可能为空,transaction.Layout.Multimedia可能为空,依此类推 我目前在每一处房产上都使用此选项: if (transaction.Layout != null) { if (transaction.Layout.Multimedia !

我在项目中使用了大量数据库数据,这些数据以不同的类导出。例如,我有

transaction.Layout.Multimedia.Images.first();
问题是这些属性不一定可用

因此,
transaction.Layout
可能为空,
transaction.Layout.Multimedia
可能为空,依此类推

我目前在每一处房产上都使用此选项:

if (transaction.Layout != null)
{
    if (transaction.Layout.Multimedia != null)
    {
        if (transaction.Layout.Multimedia.Images != null)
        {
            if (transaction.Layout.Multimedia.Images.count > 0)
            {
                var img = transaction.Layout.Multimedia.Images.first();
            }
        }
    }
}
我想知道是否有更好的方法可以检查所有父类,以确保我需要的属性可用。这些不是我使用的唯一对象,还有其他名称完全不同的对象

提前谢谢

不,还没有。新版本的.NET()具有以下特性:

然后你可以做:

if (transaction?.Layout?.Multimedia?.Image?.count > 0)
{
    var img = transaction.Layout.Multimedia.Images.first();
}
就目前而言,我们仍在坚持这一点。您可以通过连接检查来最小化所需的行,如下所示:

if ( transaction.Layout != null
     && transaction.Layout.Multimedia != null
     && transaction.Layout.Multimedia.Images != null
     && transaction.Layout.Multimedia.Images.count > 0
   )
{
    var img = transaction.Layout.Multimedia.Images.first();
}

没什么可做的了。

你可以尝试使用monad。有关更详细的说明,请参阅

With
If
扩展方法允许您编写:

var img = transaction.With(x => x.Layout)
                     .With(x => x.Multimedia)    
                     .With(x => x.Images)
                     .If(x => x.count > 0))
                     .With(x => x.first());
方法类似:

public static TResult With<TInput, TResult>(this TInput o, Func<TInput, TResult> evaluator)
  where TResult : class where TInput : class
{
  if (o == null) return null;
  return evaluator(o);
}

这有点过分,但从理论上讲,您可以使用扩展方法来实现更简单的语法:

public static class GetterExtensions {
  public static LayoutClass GetLayout(this TransactionClass transaction) {
    if (transaction == null)
      return null;
    else
      return transaction.Layout;
  }
  public static MultimediaClass GetMultimedia(this LayoutClass layout) {
    if (layout == null)
       return null;
    else
       return layout.Multimedia;
  }
  public static ImagesClass GetImages(this MultimediaClass multimedia) {
    if (multimedia == null)
       return null;
    else
       return multimedia.Images;
  }
  public static int? GetCount(this ImagesClass images) {
    if (images == null)
       return null;
    else
       return images.count;
  }
}
(其中,
LayoutClass
MultimediaClass
等是各自属性的类型)

有了这个,你就可以写作了

if (transaction.GetLayout().GetMultimedia().GetImages().GetCount() > 0)
  // ...
此解决方案利用了这样一个事实,即可以在
null
对象上调用扩展方法,而不会引发异常。在这种情况下,他们只需将
null
作为
this
参数。也不是
GetCount()
方法的
int?
返回类型(
null
),该方法允许为整数属性返回
null


但是,如果您有许多对象(具有许多属性),此解决方案可能不切实际,并且需要大量额外的维护工作。另外,编写
GetLayout()
而不是简单的
Layout
更不优雅。

我想这就是你想要的。简单的答案是没有语法魔法可以帮助你做到这一点。没有捷径,但会有“?”操作符。如果是那样的话,我们得等一等。这个新版本有发布日期吗?我想你缺少了一个
。(x=>x.Images)
Images
也可以是
null
if (transaction.GetLayout().GetMultimedia().GetImages().GetCount() > 0)
  // ...