【发布时间】:2009-10-22 14:58:02
【问题描述】:
我想与字段进行比较(例如,确保开始时间在结束时间之前)。我正在使用System.ComponentModel.DataAnnotations 属性进行验证。
我的第一个想法是这样的:
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;}
}
这不起作用,但是在标记属性的地方存在编译器错误:
Expression cannot contain anonymous methods or lambda expressions
有人对此有解决方案吗?或者验证一个字段与另一个字段值的不同方法?
【问题讨论】:
-
您是如何执行验证的?数据注释只是属性,因此在分析特定方法是否有效时,这一点很重要。请发布验证本身的短代码 sn-p。
-
[CompareTo(CompareToOperation.GreaterThan, () => this.Start)]不起作用,因为类在编译时而不是在运行时应用属性。这就是为什么您只能提供常量表达式的原因。 (并且() => this.Start不是常量表达式。)
标签: c# validation data-annotations