2011-08-26 14 views
1

我想創建一個自定義的數據註釋驗證工具,檢查列表中的所有物品是否是唯一的或不是。例如如何將對象傳遞到自定義數據註釋驗證

public class AnyClass{ 

    [Unique] 
    public List<string> UniqueListOfStrings; 
} 

現在我唯一的屬性看起來像這樣

public sealed class UniqueAttribute : ValidationAttribute 
{ 

    public UniqueAttribute() 
     : base("The items are not unique") 
    { 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var listOfValues = (IList<object>)value; 
     return listOfValues.Count != listOfValues.Distinct().Count() 
        ? new ValidationResult(ErrorMessageString) 
        : ValidationResult.Success; 
    } 
} 

到目前爲止它是好的,但我想在某種意義上屬性更通用的,我可以通過任何一類對象實施IEqualityComparer<T>。這樣一來我的新IsValid方法將看起來像

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    var listOfValues = (IList<object>)value; 
    return listOfValues.Count != 
      (_comparerClass != null 
       ? listOfValues.Distinct(_comparerClass).Count() 
       : listOfValues.Distinct().Count()) 
       ? new ValidationResult(ErrorMessageString) 
       : ValidationResult.Success; 
} 

的問題是,我沒有辦法能夠發送的對象。是否有任何解決方法,以便我可以使用旨在比較對象的comparer類。

回答

3

我沒有找到任何解決辦法傳遞對象的自定義數據註解的驗證,但解決了我做一個自定義的數據註釋驗證工具,檢查列表中的所有物品是否是唯一的或者沒有的問題。下面是代碼:

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    if(value == null) 
     return ValidationResult.Success; 
    var iComparableValues = ((IList)value).Cast<IComparable>().ToList(); 
    return AreElementsUnique(iComparableValues) 
       ? ValidationResult.Success 
       : new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
} 

private static bool AreElementsUnique(IList<IComparable> listOfValues) 
{ 
    var length = listOfValues.Count; 
    for(var i = 0;i< length;i++) 
    { 
     for(var j =i+1; j< length;j++) 
     { 
      if(listOfValues[i].CompareTo(listOfValues[j]) ==0) 
       return false; 
     } 
    } 
    return true; 
} 

我做了什麼,而不是假設比較實施IEqualityComparer<T>任何一類,我現在假設我會比較實現IComparable接口的任何類。這樣我就可以實現唯一的自定義屬性。

相關問題