据我所知,没有一种明显的更加优雅的方式来编写以下内容...。

string src;
if((ParentContent!= null)
    &&(ParentContent.Image("thumbnail") != null)
    &&(ParentContent.Image("thumbnail").Property("src") != null))
    src = ParentContent.Image("thumbnail").Property("src").Value

您认为应该使用C#语言功能来简化此功能吗?
如果是这样,它应该是什么样?
例如,扩展??运算符(operator)
string src = ParentContent??.Image("thumbnail")??.Property("src")??.Value;

为这个人为的例子表示歉意,并简化了我的解决方案。

编辑...很多年后
现在,这是一种计划中的语言功能,称为“ Null传播运算符?. https://roslyn.codeplex.com/discussions/540883(谢谢@Brian)

最佳答案

没有内置语法可以执行此操作,但是您可以定义扩展方法来执行此操作:

R NotNull<T, R>(this T src, Func<T, R> f)
    where T : class where R : class {
  return src != null ? f(src) : null;
}

现在,您可以按照以下方式重写示例:
src = ParentContent.NotNull(p => p.Image("thumbnail")).
        NotNull(i => i.Property("src")).NotNull(src => src.Value);

它不像语法支持那样好,但是我想说它更具可读性。

请注意,这会将NotNull方法添加到所有.NET类型,这可能会带来一些不便。您可以通过定义简单的包装器类型WrapNull<T> where T : class(仅包含T类型的值)和一种将任何引用类型转换为WrapNull并以NotNull类型提供WrapNull的方法来解决此问题。然后代码如下所示:
src = WrapNull.Wrap(ParentContent).NotNull(p => p.Image("thumbnail")).
        NotNull(i => i.Property("src")).NotNull(src => src.Value);

(因此,您不会使用新的扩展方法来污染每种类型的IntelliSense)

稍加努力,您也可以定义一个LINQ查询运算符来执行此操作。这有点矫kill过正,但是可以写出来(我在这里不包括定义,因为它们会更长一些,但是如果有人感兴趣的话也有可能:-))。
src = from p in WrapNull.Wrap(ParentContent)
      from i in p.Image("thumbnail").
      from src in i.Property("src")
      select src.Value;

09-25 15:48