Оператор Элвиса в цепочке вызова кастинга
Оператор Элвиса, он же оператор с нулевым условием, очень крутой.
В запросах 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;
}
}