Ho una situazione in cui desidero confrontare i campi (ad esempio, assicurandomi che l'ora di inizio sia prima dell'ora di fine). Sto usando gli attributi System.ComponentModel.DataAnnotations
per la mia convalida.Scrittura di un attributo CompareTo DataAnnotation
Il mio primo pensiero è stato qualcosa di simile:
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;}
}
Questo non funziona però, c'è un errore di compilazione in cui l'attributo è segnato:
Expression cannot contain anonymous methods or lambda expressions
Qualcuno ha una soluzione per questo ? O un approccio diverso per convalidare un campo rispetto al valore di un altro?
Come si esegue la convalida? Le annotazioni dei dati sono solo attributi, quindi questo importa un po 'quando si analizza o meno un particolare approccio funzionerà. Si prega di inviare un breve frammento di codice della convalida stessa. – Aaronaught
'[CompareTo (CompareToOperation.GreaterThan,() => this.Start)]' non funziona perché la classe ottiene gli attributi applicati in fase di compilazione anziché in fase di esecuzione. Ecco perché sei autorizzato a fornire solo espressioni costanti. (e '() => this.Start' non è un'espressione costante.) – Regent