J'ai une situation dans laquelle je souhaite comparer des champs (par exemple, s'assurer que l'heure de début est antérieure à l'heure de fin). J'utilise les attributs System.ComponentModel.DataAnnotations
pour ma validation.Ecriture d'un attribut CompareTo DataAnnotation
Ma première pensée était quelque chose comme ceci:
public enum CompareToOperation
{
EqualTo,
LessThan,
GreaterThan
}
public class CompareToAttribute : ValidationAttribute
{
CompareToOperation _Operation;
IComparable _Comparision;
public CompareToAttribute(CompareToOperation operation, Func<IComparable> comparison)
{
_Operation = operation;
_Comparision = comparison();
}
public override bool IsValid(object value)
{
if (!(value is IComparable))
return false;
switch (_Operation)
{
case CompareToOperation.EqualTo: return _Comparision.Equals(value);
case CompareToOperation.GreaterThan: return _Comparision.CompareTo(value) == 1;
case CompareToOperation.LessThan: return _Comparision.CompareTo(value) == -1;
}
return false;
}
}
public class SimpleClass
{
public DateTime Start {get;set;}
[CompareTo(CompareToOperation.GreaterThan,() => this.Start)] // error here
public DateTime End {get;set;}
}
Cela ne fonctionne cependant pas, il y a une erreur de compilation où l'attribut est marqué:
Expression cannot contain anonymous methods or lambda expressions
Quelqu'un at-il une solution à ce ? Ou une approche différente pour valider un champ par rapport à la valeur d'un autre?
Comment effectuez-vous la validation? Les annotations de données ne sont que des attributs, ce qui importe un peu lorsque vous analysez si une approche particulière fonctionnera ou non. Veuillez poster un extrait de code court de la validation elle-même. – Aaronaught
'[CompareTo (CompareToOperation.GreaterThan,() => this.Start)]' ne fonctionne pas car la classe obtient les attributs appliqués à la compilation plutôt qu'à l'exécution. C'est pourquoi vous êtes autorisé à fournir des expressions constantes uniquement. (et '() => this.Start' n'est pas une expression constante. – Regent