0

FluentValidationのような単純な Validate メソッドを書きたい

私はこの簡単なコードを書きました:

public static class ExtensionMethods<T> where T : class 
{
    public static bool Validate(Func<T, bool> expression)
    {
        //What I should write?????
    }
}

メソッド本体に何を書けばいいのか、どう使えばいいのかわからない。


編集1

すべてのオブジェクトに対してこのようなコードを書きたい:

ExtensionMethods<MyObject>.Validate(o=>o.ID == 1).AddMessage(....
4

1 に答える 1

5

まず第一に、流暢なインターフェイスの鍵は、メソッド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();
于 2012-09-15T08:08:40.660 に答える