Elvis运算符在一个转换调用链中

时间:2016-01-28 12:31:10

标签: c# linq c#-6.0 null-coalescing-operator null-conditional-operator

elvis运算符,即null条件运算符,非常酷。

在LINQ查询中,它与null-coalescing" ??"操作

Somedata.Where(dt=>(dt?.Inner?.InnerMost?.Include=="Yes")??false);

但是如果你需要施放中间值,你会怎么做?

对于链中的一个链接,它可以正常工作。

Somedata.Where(dt=>(
     ((InnerClass)dt?.Inner)
     ?.InnerMost)?.Include=="Yes")
     ??false);

但是通过额外的必要演员阵容,演员阵容和调用将被分开"。

Somedata.Where(dt=>(
     ((InnerMostClass)            <=== Cast
     ((InnerClass)dt?.Inner)
     ?.InnerMost)?.Include=="Yes"))         <=== Use
     ??false);

这里可能不止一次弄乱了括号,但我希望你明白这个想法。

虽然这&#34;训练残骸&#34;调用链是一种代码气味,是否有更具表现力的方式来提高简洁性和清晰度?

1 个答案:

答案 0 :(得分:1)

您可以使用非常简单的扩展方法继续链接并阻止括号:

dt?.Inner.As<InnerClass>()?.InnerMost.As<InnerMostClass>()?.Include == "Yes"

使用如下定义的扩展方法:

public static class ObjectExtensions
{
    public static T As<T>(this object obj) where T : class
    {
        return obj as T;
    }
}