可以在C#5.0中创建一些扩展方法,给出与C#6.0 Elvis(?)操作符相同的结果.
例如:
//C# 6.0 way var g1 = parent?.child?.child?.child; if (g1 != null) // TODO //C# 5.0 way var g1 = parent.elvisExtension().child.elvisExtension().child.elvisExtension().child; if (g1 != null) // TODO
解决方法
可能使用与嘲笑相同的方法(而不是返回父级,它将返回父项的“mock”,它将返回null或对象值).但是,这有点复杂.
这是相当简单的,并获得基本功能:
public static class Helper { public static TReturnType Elvis<TOnType,TReturnType>(this TOnType onObj,Func<TOnType,TReturnType> selector) where TReturnType : class { if (onObj == null) return null; return selector(onObj); } }
测试:
var person = new Person { Parent = new Person { Parent = new Person() } }; var result = person.Elvis(p => p.Parent).Elvis(p => p.Parent);
正确获取Person对象.
person = new Person(); result = person.Elvis(p => p.Parent).Elvis(p => p.Parent);
返回null.
但是,这仅适用于可空类型.不幸的是,你不能为TReturnType:struct创建一个重载,我们需要一个新的方法来处理它.
因此,对于不可空类型,我们需要:
public static TReturnType? Elviss<TOnType,TReturnType> selector) where TReturnType : struct { if (onObj == null) return default(Nullable<TReturnType>); return selector(onObj); }
并测试它:
var result = person.Elvis(p => p.Parent).Elviss(p => p.Id);