C#5.0中的Elvis(?.)扩展方法

C#5.0中的Elvis(?.)扩展方法,第1张

概述可以在C#5.0中创建一些扩展方法,给出与C#6.0 Elvis(?) *** 作符相同的结果. 例如: //C# 6.0 wayvar g1 = parent?.child?.child?.child; if (g1 != null) // TODO//C# 5.0 wayvar g1 = parent.elvisExtension().child.elvisExtension().chi 可以在C#5.0中创建一些扩展方法,给出与C#6.0 Elvis(?) *** 作符相同的结果.

例如:

//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(?.)扩展方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1234767.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存