例如:
//C# 6.0 wayvar g1 = parent?.child?.child?.child; if (g1 != null) // Todo//C# 5.0 wayvar 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);总结
以上是内存溢出为你收集整理的C#5.0中的Elvis(?.)扩展方法全部内容,希望文章能够帮你解决C#5.0中的Elvis(?.)扩展方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)