2012-09-15 41 views
0

我想寫一個簡單的驗證方法一樣FluentValidation驗證使用Func鍵<T,bool>

我寫了這個簡單的代碼的對象:

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(.... 
+0

第一點,如果確認返回bool的那你怎麼調用方法addMessage就可以了? –

回答

5

首先,關鍵流利的接口是你的方法 - Validate,在這種情況下 - 不要返回布爾值,而是返回一個可以再次調用的對象。所以我們說這是T這裏。另外,你並沒有真正使用擴展方法的語法,你只是定義一個靜態方法。在我們開始之前還有最後一件事情 - 你在你的類定義中設置了泛型參數T,但是這對靜態類來說不是正確的,因爲它們從來沒有用任何特定的泛型參數實例化。你需要將它添加到方法簽名,而不是類簽名:

因此,這裏是你的方法與這兩個變化:

public static class ExtensionMethods 
{ 
    public static T Validate<T>(this T myObj, Func<T, bool> expression) 
     where T : class 
    { 
    } 
} 

現在,你要在那裏做什麼,你只需要調用驗證表達。這是一個委託,所以你可以稱它爲一個函數,並將第一個參數MyObject作爲參數傳遞給它。如果返回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(); 
+0

好的答案,關鍵在於在「ExtensionMethods 」這個問題中**必須是T類型的對象**。如何實現這一點很棘手。但是,在實例上使用此擴展方法語法是我能看到的最接近的語法。 –

+1

或更好的是,將通用參數(和通用約束)移動到該方法。我補充說。 –

+0

好的。小改進:你不需要'else'語句;) – Wasp

相關問題