Tengo una situación en la que quiero comparar campos (por ejemplo, asegurar que la hora de inicio sea anterior a la hora de finalización). Estoy usando los atributos System.ComponentModel.DataAnnotations
para mi validación.Escribir un atributo CompareTo DataAnnotation
Mi primer pensamiento fue algo como esto:
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;}
}
Esto no funciona, sin embargo, hay un error de compilación, donde está marcado el atributo:
Expression cannot contain anonymous methods or lambda expressions
¿Alguien tiene una solución para esto ? ¿O un enfoque diferente para validar un campo en comparación con el valor de otro?
¿Cómo está realizando la validación? Las anotaciones de datos son solo atributos, por lo que esto importa un poco al analizar si un enfoque particular funcionará o no. Por favor, publique un breve fragmento de código de la validación en sí. – Aaronaught
'[CompareTo (CompareToOperation.GreaterThan,() => this.Start)]' no funciona porque la clase obtiene atributos aplicados en tiempo de compilación en lugar de en tiempo de ejecución. Es por eso que solo puedes proporcionar expresiones constantes. (y '() => this.Start' no es una expresión constante.) – Regent