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

前端之家收集整理的这篇文章主要介绍了C#5.0中的Elvis(?.)扩展方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
可以在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);

猜你在找的C&C++相关文章