J'ai donc un modèle de règle de validation simple que j'utilise pour effectuer une validation sur des objets d'entité. Voici ma classe ValidationRule:J'ai des problèmes avec les génériques et la diffusion en C#
public class ValidationRule {
public Func<object, bool> Rule { get; set; }
public string ErrorMessage { get; set; }
public ValidationRule(string errorMessage, Func<object, bool> rule) {
Rule = rule;
ErrorMessage = errorMessage;
}
public bool IsValid(object obj) {
return Rule(obj);
}
}
J'ai une classe de base pour mes objets d'entité qui encapsulent les méthodes pour effectuer la validation qui ressemble à ceci:
public abstract class ModelBase {
private List<ValidationRule> _validationRules;
public List<ValidationRule> ValidationRules {
get {
if (_validationRules == null)
_validationRules = new List<ValidationRule>();
return _validationRules;
}
set { _validationRules = value; }
}
public ValidationResult Validate() {
var result = new ValidationResult();
rules.ForEach(r => {
if (!r.IsValid(this))
result.Errors.Add(
new ValidationError(r.ErrorMessage, r.PropertyName));
});
return result;
}
}
Et maintenant est là le vrai problème, je suis essayant de résoudre. Lorsque je crée une nouvelle classe qui hérite de ModelBase, l'ajout de règles de validation est un peu gênant. Par exemple:
public class Client : ModelBase {
public int ID{ get; set; }
public string Name { get; set; }
public Address MailingAddress { get; set; }
public Client() {
CreateValidationRules();
}
private void CreateValidationRules() {
ValidationRules.Add(new ValidationRule("Client 'Name' is required.",
c => !string.IsNullOrEmpty(((Client)c).Name)));
}
}
Notez où je crée la liste des règles de validation. A l'intérieur de l'expression lambda, je dois lancer "c" en "Client" car ma règle est essentiellement Func<object, bool>
. J'ai essayé plusieurs façons de rendre ce générique en faisant quelque chose comme ValidationRule<Client>
mais je rencontre toujours des problèmes avec l'appel Validate()
dans la classe ModelBase. Des idées sur la façon de contourner ce casting?
comme une note de côté, Func
"le même" type de fonctionnalité. Mais pour une raison étrange, ils ne sont pas les mêmes dans le système de types. – MichaelGG
Ils ne sont pas identiques, mais vous pouvez convertir entre les deux. –