Я создал простой класс ArgumentValidator
, чтобы упростить предварительные условия аргумента в любом заданном методе. Большинство из них null
или Bounds проверки, и это становится довольно утомительным после несколькихПолучение имени вызываемого абонента метода расширения
if (arg == null) throw new ArgumentNullException(nameof(arg));
Так я пришел с следующими настройками:
public static class ArgumentValidator
{
public interface IArgument<T>
{
string ParamName { get; }
T Value { get; }
}
private class Argument<T>: IArgument<T>
{
public Argument(T argument, string paramName)
{
ParamName = paramName;
Value = argument;
}
public string ParamName { get; }
public T Value { get; }
}
public static IArgument<T> Validate<T>(this T argument, string paramName = null)
{
return new Argument<T>(argument, paramName ?? string.Empty);
}
public static IArgument<T> IsNotNull<T>(this IArgument<T> o)
{
if (ReferenceEquals(o.Value, null))
throw new ArgumentNullException(o.ParamName);
return o;
}
public static IArgument<T> IsSmallerThan<T, Q>(this IArgument<T> o, Q upperBound) where T : IComparable<Q> { ... }
//etc.
}
И я могу использовать его в следующим образом:
public Bar Foo(object flob)
{
flob.Validate(nameof(flob)).IsNotNull().IsSmallerThan(flob.MaxValue);
}
в идеале я хотел бы, чтобы избавиться от nameof(flob)
в Validate
вызова и в конечном итоге избавиться от Validate
alltoge Ther; единственная цель Validate
состоит в том, чтобы не пропускать nameof(...)
при каждой проверке цепи.
Есть ли способ получить имя flob
внутри метода Validate()
?
Спасибо, это очень интересно. Является ли что-то подобное способом расширения даже возможным? Я могу жить с обычным статическим методом «Validate», но мне любопытно, почему это метод расширения делает все сложнее. – InBetween
Ну, ваша собственность должна быть выражением тогда ... На мой взгляд, это не работает. –