Я пытаюсь написать универсальную функциональность проверки параметров метода, которая может быть объединена в цепочку (свободный интерфейс), чтобы присоединять все больше проверок / проверок, таких как:
public void SomeMethod(User user, string description)
{
ParameterHelper
.Create(() => user)
.RejectNull();
ParameterHelper
.Create(() => description)
.RejectNull()
.RejectEmptyString();
// now this would be luxurious
ParameterHelper
.Create(() => new { user = user, desc = description })
.RejectNull(o => o.user)
.RejectNull(o => o.desc)
.RejectEmptyString(o => o.desc);
}
Я хотел бы использовать этот вспомогательный класс для проверки параметров метода для определенных значений перед их использованием (большую часть времени будет проверяться null
).
Текущее Положение
Я впервые начал писать статический вспомогательный класс без метода Create()
, например:
public static class ParameterHelper
{
public static void RejectNull(Expression<Func<T>> expr)
{
if (expr.Compile()().Equals(default(T)))
{
MemberExpression param = (MemberExpression)expr.Body;
throw new ArgumentNullException(param.Member.Name);
}
}
}
Но это не позволяет цепочки. Вот почему я создал метод Create()
, который будет возвращать что-то, что может быть использовано методами цепного расширения.
проблема
- Я бы хотел избежать нескольких вызовов
Compile()
, поэтому мой метод Create()
должен возвращать Func<T>
, а методы отклонения должны быть методами расширения Func<T>
.
- Если мой
Create()
вернет Func<T>
, у меня нет возможности прочитать имена параметров, которые должны быть предоставлены для различных исключений (используя MemberExpression
).
- Если я верну
Expression<Func<T>>
, вместо этого мне придется вызывать Compile()
в каждом Reject
методе расширения.
Вопросы
- Существует ли библиотека C #, которая уже выполняет такую цепочку?
- Если нет, что вы предлагаете, как это должно быть сделано? Любые примеры из Интернета будут тепло приветствоваться.
Дополнительные примечания
Я должен отметить, что сложный / длинный код вызова проверки не является вариантом здесь, потому что моя текущая проверка выполняется как:
if (user == null)
{
throw new ArgumentNullException("user");
}
или
if (string.IsNullOrEmpty(description))
{
throw new ArgumentNullException("description");
}
Который имеет два основных недостатка:
- Я повторяю одни и те же строки кода снова и снова
- используются магические строки
Таким образом, проверка должна выполняться с одним вкладышем на проверку, как описано выше в желаемом сценарии.