2015-10-09 1 views
0

Voici ce que je veux faire:passage de paramètre à la méthode d'extension IRuleBuilder

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

Voici comment méthode d'extension ressemble à:

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)); 
    } 
} 

Le problème est que je ne sais pas comment correctement passer le paramètre Pays ou comment spécifier le paramètre pays dans la méthode d'extension. En utilisant le code ci-dessus, j'obtiens l'erreur de compilation: Impossible de convertir l'expression lambda de type « int » car il est pas un type de délégué

+0

Il semble bien, quel est le problème exactement? –

Répondre

0

Le problème est d'accéder à la « frères et soeurs » propriété Country hors du User. Que faire si vous faites la méthode d'extension hors de l'objet User comme ceci à la place?

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

La méthode d'extension alors besoin d'une contrainte:

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

Il défait le point de la méthode si je le restreindre uniquement pour la classe User. J'ai plusieurs classes non liées qui ont des champs Country/State et il ne serait pas logique d'avoir une interface commune pour ces classes. – user1242967

+0

La seule façon dont la méthode d'extension fonctionnera comme ceci est de la contraindre avec une classe/interface qui expose 'Country' et' State'. Alternativement, vous pouvez faire en sorte que la méthode d'extension prenne ces deux valeurs comme 'IsStateOfCountry' et simplement transmettre celles de l'appel de validation. Quelque chose comme ceci (non testé): 'RuleFor (m => m.User) .Must ((m, utilisateur) => IsStateOfCountry (user.State, user.Country));' –