据我所知,没有一种明显的更加优雅的方式来编写以下内容...。
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;