1

コレクションを検証するためのカスタム検証属性があります。これを 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;
     }
}

count() または any() を確認できるように、IEnumerable にキャストするのに問題があります。

何か案は?

4

2 に答える 2

5

これを試して

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;

注: のテストICollection.Countは、列挙子を取得して列挙子の列挙を開始するよりも効率的です。したがって、Count可能な限りプロパティを使用するようにしています。ただし、コレクションは常に を実装するため、2 番目のテストは単独で機能しますIEnumerable

継承階層は次のようになりますIEnumerable > ICollection > IListIList実装ICollectionおよびICollection実装しIEnumerableます。したがってIEnumerable、適切に設計されたタイプのコレクションまたは列挙では機能しますが、 では機能しませんIList。たとえばDictionary<K,V>は実装されていませんIListICollection、したがってまたIEnumeration.


.NET 命名規則では、属性クラス名は常に "Attribute" で終わる必要があるとされています。したがって、クラスの名前はCollectionHasElementsAttribute. 属性を適用するときは、「属性」部分をドロップできます。

[CollectionHasElements]
public List<string> Names { get; set; }
于 2012-06-20T14:30:14.373 に答える
0

リストおよびチェックボックス リストの必須の検証属性

[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; }
于 2015-12-12T13:42:04.880 に答える