У меня есть метод, который может быть записан довольно аккуратно через метод построения цепочки:LINQ цепочки и зернистый обработки ошибок
return viewer.ServerReport.GetParameters()
.Single(p => p.Name == Convention.Ssrs.RegionParamName)
.ValidValues
.Select(v => v.Value);
Однако я хотел бы быть в состоянии сделать некоторые проверки в каждой точке, как я хочу предоставить полезную диагностическую информацию, если какой-либо из прикованных методов возвращает неожиданные результаты.
Для этого мне нужно разбить всю цепочку и выполнить каждый звонок с помощью блока if
. Это делает код намного менее удобочитаемым.
В идеале я хотел бы иметь возможность переплетаться в некоторых цепочках вызовов, которые позволят мне обрабатывать неожиданные результаты в каждой точке (например, бросать осмысленное исключение, такое как new ConventionException("The report contains no parameter")
, если первый метод возвращает пустую коллекцию). Может ли кто-нибудь предложить простой способ достичь такого?
Edit:
Это результат использования @ ответ JeffreyZhao в:
return viewer.ServerReport.GetParameters()
.Assert(result => result.Any(), "The report contains no parameter")
.SingleOrDefault(p => p.Name == Convention.Ssrs.RegionParamName)
.Assert(result => result != null, "The report does not contain a region parameter")
.ValidValues
.Select(v => v.Value)
.Assert(result => result.Any(), "The region parameter in the report does not contain any valid value");
Это выглядит хорошо. И учитывая характер проверки ошибок, я подозреваю, что может быть, что общие методы не понадобятся (т. Е. Часто характер проверки ошибки специфичен для данного типа). Общий подход к тому, чтобы иметь метод расширения, который просто возвращает входные данные без изменений, является именно тем, что необходимо. – Chris
Вы правы.Я добавил более общий метод 'Validate', и в этом случае требуется общий. –
Ницца. Мне жаль, что я не смогу еще раз повторить эту приятную маленькую функцию 'Validate'. :) – Chris