2015-10-09 4 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)); 
    } 
} 

Проблема в том, я не знаю, как правильно введите параметр Страна или как я должен указать параметр страны в методе расширения. Используя код выше, я получаю ошибку компиляции: Не удается преобразовать лямбда-выражения к типу «Int», потому что это не тип делегата

+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

Это поражает точку метода, если я ограничиваю ее только для класса User. У меня есть несколько несвязанных классов, у которых есть поля Country/State, и было бы бессмысленно иметь общий интерфейс для этих классов. – user1242967

+0

Единственный способ, которым будет работать метод расширения, - это ограничить его классом/интерфейсом, который предоставляет «Страна» и «Состояние». В качестве альтернативы вы можете заставить метод расширения использовать эти два значения, например 'IsStateOfCountry', и просто передать их из вызова проверки. Что-то вроде этого (untested): 'RuleFor (m => m.User) .Must ((m, user) => IsStateOfCountry (user.State, user.Country));' –