5

基本的に、オブジェクトのコレクションがある場合、コレクション内の各アイテム ( などMaxLengthAttribute) に検証属性を適用するにはどうすればよいですか?

public class Foo
{
    public ICollection<string> Bars { get; set; }
}

たとえば、Barsに最大長 256 に対して検証される文字列が含まれていることを確認するにはどうすればよいですか?

アップデート:

単一のプロパティに検証属性を適用する方法は理解していますが、コレクション内のオブジェクトに適用する方法を尋ねる質問があります。

public class Foo
{
    [StringLength(256)] // This is obvious
    public string Bar { get; set; }

    // How do you apply the necessary attribute to each object in the collection!
    public ICollection<string> Bars { get; set; }
}
4

3 に答える 3

2

この質問はちょっと古いですが、答えを探している人がいるかもしれません。

コレクションアイテムに属性を適用する一般的な方法は知りませんが、特定の文字列の長さの例では、次を使用しました。

public class StringEnumerationLengthValidationAttribute : StringLengthAttribute
{
    public StringEnumerationLengthValidationAttribute(int maximumLength)
        : base(maximumLength)
    { }

    public override bool RequiresValidationContext { get { return true; } }
    public override bool IsValid(object value)
    { return false; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var e1 = value as IEnumerable<string>;
        if (e1 != null) return IsEnumerationValid(e1, validationContext);
        return ValidationResult.Success; // what if applied to something else than IEnumerable<string> or it is null?
    }

    protected ValidationResult IsEnumerationValid(IEnumerable<string> coll, ValidationContext validationContext)
    {
        foreach (var item in coll)
        {
            // utilize the actual StringLengthAttribute to validate the items
            if (!base.IsValid(item) || (MinimumLength > 0 && item == null))
            {
                return new ValidationResult(base.FormatErrorMessage(validationContext.DisplayName));
            }
        }
        return ValidationResult.Success;
    }
}

コレクション アイテムごとに 4 ~ 10 文字を要求するには、次のように適用します。

[StringEnumerationLengthValidation(10, MinimumLength=4)]
public ICollection<string> Sample { get; set; }
于 2015-08-25T16:40:15.637 に答える
1

OK、これに関する有用な情報を説明している非常に素晴らしい記事を見つけました。

http://blogs.msdn.com/b/codeanalysis/archive/2006/04/27/faq-why-does-donotexposegenericlists-recommend-that-i-expose-collection-lt-t-gt-instead-of- list-lt-t-gt-david-kean.aspx

以下は、Foo の Bars メンバーに必要な処理を実行させるコードの例です。

public class Foo
{
    public ValidatedStringCollection Bars = new ValidatedStringCollection(10);
}

public class ValidatedStringCollection : Collection<string>
{

    int _maxStringLength;

    public ValidatedStringCollection(int MaxStringLength)
    {
        _maxStringLength = MaxStringLength;
    }

    protected override void InsertItem(int index, string item)
    {
        if (item.Length > _maxStringLength)
        {
            throw new ArgumentException(String.Format("Length of string \"{0}\" is beyond the maximum of {1}.", item, _maxStringLength));
        }
        base.InsertItem(index, item);
    }

}

class Program
{
    static void Main(string[] args)
    {
        Foo x = new Foo();
        x.Bars.Add("A");
        x.Bars.Add("CCCCCDDDDD");
        //x.Bars.Add("This string is longer than 10 and will throw an exception if uncommented.");

        foreach (string item in x.Bars)
        {
            Console.WriteLine(item);
        }

        Console.ReadKey();
    }
}

リンクされた記事には、コレクションの他のメソッドのオーバーライド、条件付きでのイベントの実装など、いくつかの提案があります。うまくいけば、これでカバーできるはずです。

于 2012-12-31T18:48:46.090 に答える
-1

データ注釈機能を見てみましょう。

これはうまくいきますか?

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
public class Foo
{  
    [StringLength(256)]
    public ICollection<string> Bars { get; set; }
}
于 2012-12-31T04:48:09.820 に答える