IEnumerable 属性的验证属性



我有这个自定义验证属性来验证集合。 我需要调整它以使用 IEnumerable。 我尝试将该属性设置为泛型属性,但不能具有泛型属性。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class CollectionHasElements : System.ComponentModel.DataAnnotations.ValidationAttribute 
{
     public override bool IsValid(object value)
     {
         if (value != null && value is IList)
         {
             return ((IList)value).Count > 0;
         }
         return false;
     }
}

我在将其转换为 IEnumerable 时遇到问题,以便我可以检查它的 count() 或 any()。

有什么想法吗?

试试这个

var collection = value as ICollection;
if (collection != null) {
    return collection.Count > 0;
}
var enumerable = value as IEnumerable;
if (enumerable != null) {
    return enumerable.GetEnumerator().MoveNext();
}

return false;

或者,从具有模式匹配的 C# 7.0 开始:

if (value is ICollection collection) {
    return collection.Count > 0;
}
if (value is IEnumerable enumerable) {
    return enumerable.GetEnumerator().MoveNext();
}
return false;

注意:测试ICollection.Count比获取枚举器并开始枚举枚举器更有效。因此,我尽可能使用 Count 属性。但是,第二个测试将单独工作,因为集合始终实现IEnumerable

继承层次结构如下所示:IEnumerable > ICollection > IList . IList实现ICollectionICollection实现IEnumerable。因此,IEnumerable适用于任何设计良好的集合或枚举类型,但不适用于IList。例如,Dictionary<K,V>不实现IList而是ICollection,因此也IEnumeration

<小时 />

.NET 命名约定规定属性类名应始终以"属性"结尾。因此,您的类应命名为 CollectionHasElementsAttribute 。应用属性时,您可以删除"属性"部分。

[CollectionHasElements]
public List<string> Names { get; set; }

列表和复选框列表的必需验证属性

[AttributeUsage(AttributeTargets.Property)]
public sealed class CustomListRequiredAttribute : RequiredAttribute
{
    public override bool IsValid(object value)
    {
        var list = value as IEnumerable;
        return list != null && list.GetEnumerator().MoveNext();
    }
}

如果您有复选框列表

[AttributeUsage(AttributeTargets.Property)]
public sealed class CustomCheckBoxListRequiredAttribute : RequiredAttribute
{
    public override bool IsValid(object value)
    {
        bool result = false;
        var list = value as IEnumerable<CheckBoxViewModel>;
        if (list != null && list.GetEnumerator().MoveNext())
        {
            foreach (var item in list)
            {
                if (item.Checked)
                {
                    result = true;
                    break;
                }
            }
        }
        return result;
    }
}

这是我的视图模型

public class CheckBoxViewModel
{        
    public string Name { get; set; }
    public bool Checked { get; set; }
}

用法

[CustomListRequiredAttribute(ErrorMessage = "Required.")]
public IEnumerable<YourClass> YourClassList { get; set; }
[CustomCheckBoxListRequiredAttribute(ErrorMessage = "Required.")]
public IEnumerable<CheckBoxViewModel> CheckBoxRequiredList { get; set; }

相关内容

  • 没有找到相关文章