Оператор Элвиса в цепочке вызова кастинга

Оператор Элвиса, он же оператор с нулевым условием, очень крутой.

В запросах 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" является запахом кода, есть ли более выразительный способ сделать это для улучшения краткости и ясности?

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;
    }
}
Другие вопросы по тегам