2015-10-09 58 views
0

這就是我想做的事:傳遞參數IRuleBuilder擴展方法

RuleFor(m => m.User.State). 
    StateIsValid(m => m.User.Country); 

這是擴展方法的樣子:

public static class ValidationExtensions 
{ 
    public static IRuleBuilderOptions<T, int?> StateIsValid<T>(this IRuleBuilder<T, int?> rule, int country) 
    { 
     return rule 
      .Must(state => IsStateOfCountry(state, country)); 
    } 
} 

的問題是我不知道如何正確地通過國家參數或我應該如何在擴展方法中指定國家參數。 使用上面的代碼,我得到的編譯錯誤:無法轉換lambda表達式類型「詮釋」,因爲它不是一個委託類型

+0

它似乎罰款,究竟是什麼問題呢? –

回答

0

問題是訪問「兄弟」屬性Country關閉User的。如果將這種擴展方法從User這樣的對象變爲這樣呢?然後

RuleFor(m => m.User). 
    StateIsValid(); 

擴展方法需要一個約束:

public static class ValidationExtensions 
{ 
    public static IRuleBuilderOptions<TOuterClass, TUser> StateIsValid<TOuterClass, TUser>(this IRuleBuilder<TOuterClass, TUser> ruleBuilder) 
     where TUser : User 
    { 
     return ruleBuilder 
      .Must(user => IsStateOfCountry(user.State, user.Country)); 
    } 

} 
+0

如果我僅限於用戶類,它就會破壞方法的要點。我有多個不相關的類具有國家/州/州字段,並且爲這些類設置公共接口是沒有意義的。 – user1242967

+0

擴展方法的工作方式的唯一方法是使用公開'Country'和'State'的類/接口來限制它。或者,您可以使擴展方法採用像IsStateOfCountry這樣的兩個值,並簡單地從驗證調用中傳入這些值。像這樣(未經測試):'RuleFor(m => m.User).Must((m,user)=> IsStateOfCountry(user.State,user.Country));' –