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

Tor*_*mod 5 c# linq null-coalescing-operator c#-6.0 null-conditional-operator

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

在LINQ查询中,它与null合并"??"一致很好用 运营商.

Somedata.Where(dt=>(dt?.Inner?.InnerMost?.Include=="Yes")??false);
Run Code Online (Sandbox Code Playgroud)

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

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

Somedata.Where(dt=>(
     ((InnerClass)dt?.Inner)
     ?.InnerMost)?.Include=="Yes")
     ??false);
Run Code Online (Sandbox Code Playgroud)

但是通过额外的必要施法,施法和调用被"驱散".

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

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

虽然这个"火车残骸"调用链是一种代码味道,但这样做是否有更具表现力的方式来提高简洁性和清晰度?

mnw*_*mit 1

您可以使用非常简单的扩展方法来保持链接并防止括号:

dt?.Inner.As<InnerClass>()?.InnerMost.As<InnerMostClass>()?.Include == "Yes"
Run Code Online (Sandbox Code Playgroud)

扩展方法定义如下:

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