5

elvis 运算符,又名空条件运算符,非常酷。

在 LINQ 查询中,它与空合并“??”配合使用效果很好。操作员。

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);

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

虽然这个“trainwreck”调用链是一种代码味道,但有没有一种更具表现力的方式来提高简洁性和清晰度?

4

1 回答 1

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;
    }
}
于 2016-03-13T20:07:06.197 回答