我有一種情況,我想比較字段(例如,確保開始時間在結束時間之前)。我正在使用System.ComponentModel.DataAnnotations
屬性進行驗證。寫一個CompareTo DataAnnotation屬性
我首先想到的是這樣的:
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
有沒有人有一個解決方案?或者與另一個字段的值相比驗證一個字段的方法不同?
您如何執行驗證?數據註釋只是屬性,所以在分析某個特定方法是否可行時,這很重要。請發佈驗證本身的簡短代碼片段。 – Aaronaught
'[CompareTo(CompareToOperation.GreaterThan,()=> this.Start)]'不起作用,因爲類在編譯時獲取屬性,而不是在運行時應用。這就是爲什麼你只能提供常量表達式的原因。 (和'()=> this.Start'不是一個常量表達式。) – Regent