Я создаю простой API-интерфейс Guard для защиты от незаконных параметров, передаваемых в функции и т.д.
У меня есть следующий код:
public static class Guard
{
public static GuardArgument<T> Ensure<T>(T value, string argumentName)
{
return new GuardArgument<T>(value, argumentName);
}
}
public class GuardArgument<T>
{
public GuardArgument(T value, string argumentName)
{
Value = value;
Name = Name;
}
public T Value { get; private set; }
public string Name { get; private set; }
}
// Example extension for validity checks
public static GuardArgument<T> IsNotNull<T>(this GuardArgument<T> guardArgument, string errorMessage)
{
if (guardArgument.Value == null)
{
throw new ArgumentNullException(guardArgument.Name, errorMessage);
}
return guardArgument;
}
В настоящий момент код можно использовать аналогично (обратите внимание, что это просто тупой пример):
void DummyMethod(int? someObject) {
Guard.Ensure(someObject, "someObject")
.IsNotNull()
.IsGreaterThan(0)
.IsLessThan(10);
}
Все это прекрасно работает. То, что я хочу сделать сейчас, - это расширить API для включения дочерних свойств в проверки следующим образом:
Guard.Ensure(someObject, "someObject")
.IsNotNull()
.Property(
(x => x.ChildProp1, "childProp1")
.IsNotNull()
.IsGreaterThan(10)
)
.Property(
(x => x.ChildProp2, "childProp2")
.IsNotNull()
.IsLessThan(10)
);
Очевидно, что новый метод .Property
должен возвращать родительский GuardArgument
для цепочки. Кроме того, дочернее свойство должно иметь возможность использовать существующие методы проверки (IsNotNull()
и т.д.), Чтобы избежать дублирования кода.
Я не могу понять, как построить параметры функции лямбда/свойства или где должен располагаться метод .Property
, т.е. должен ли он быть свойством в GuardArgument
или где-то еще, или даже если есть лучшая структура к API.