まず第一に、流暢なインターフェイスの鍵は、メソッドValidate
(この場合は ) が bool を返さず、再度呼び出すことができるオブジェクトを返すことです。ここでは T としましょう。さらに、実際には拡張メソッド構文を使用しているのではなく、静的メソッドを定義しているだけです。開始する前に最後に 1 つ - クラス定義でジェネリック パラメーター T を設定しますが、静的クラスは特定のジェネリック パラメーターでインスタンス化されないため、これは正しいことではありません。クラスの署名ではなく、メソッドの署名に追加する必要があります。
したがって、これら2つの変更を加えた方法は次のとおりです。
public static class ExtensionMethods
{
public static T Validate<T>(this T myObj, Func<T, bool> expression)
where T : class
{
}
}
そこでやりたいことは、検証式を呼び出すだけです。これはデリゲートなので、関数であるかのように呼び出すだけで、最初のパラメーターである yourMyObject
をパラメーターとして渡します。false が返された場合、ステートメント全体で例外がスローされると想定します。
public static T Validate(this T myObj, Func<T, bool> expression)
{
if (expression(myObj))
{
return myObj; // Return the object for further processing.
}
else
{
throw new OhNoValidationFailedException("aaaaaaaaahhh!");
}
}
次のように使用できるようになりました。
MyObject myObject = new MyObject();
myObject.Validate(o => o.MyProperty == 7).Do().Something().Else();