不正なパラメーターが関数などに渡されるのを防ぐために、単純なGuardAPIを構築しています。
私は次のコードを持っています:
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の構造が優れている場合でもです。
次の関数を使用すると、必要な構文と同様の構文を使用できます。
public static GuardArgument<T> Property<T, TProp>(this GuardArgument<T> guardArgument, Func<T, TProp> getProperty, string propertyName, Action<GuardArgument<TProp>> validate)
{
GuardArgument<TProp> propertyGuardArgument = new GuardArgument<TProp>(getProperty(guardArgument.Value), propertyName);
validate(propertyGuardArgument);
return guardArgument;
}
この関数は、選択したプロパティの新しいGuardArgumentを作成し、これをAction
パラメーターに渡して、必要に応じて検証できるようにします。
これにより、プロパティを無限に連鎖させることもできますが、特に読みやすいかどうかはわかりません。
使用法:
Guard.Ensure(someObject, "someObject")
.IsNotNull()
.Property(x => x.ChildProp1, "childProp1", childProp1 =>
childProp1.IsNotNull()
.IsLessThan(10)
.Property(y => y.InnerChildProperty, "innerChildProperty", innerChildProperty =>
innerChildProperty.IsNotNull()
)
)
.Property(x => x.ChildProp2, "childProp2", childProp2 =>
childProp2.IsNotNull()
.IsGreaterThan(10)
);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加