1

タイトルで申し訳ありませんが、この問題に何を使用すればよいかわかりません。

問題は、このような C# アプリケーションでの検証の実装に属性とリフレクションを使用していることです。

public class foo : validationBase
{
    [RequiredAttribute("id is required")]
    public int id { get; set; }
    [RequiredAttribute("name is required")]
    public string name { get; set; }

    void save()
    {
       this.IsValid();
       //some code
    }
    void update()
    {
       this.IsValid();
       //some code
    }
    void delete()
    {
       // Need some magic here to ignore name attribute's required validation as only id 
       // is needed for delete operation
       this.IsValid();

       //some code
    }
}

name削除操作でわかるように、プロパティに必要な検証を検証したくないことに注意してください。単一のプロパティにさらにいくつかの検証属性が存在する可能性があり、1 つの属性の検証が起動されるべきではなく、他の属性の検証が起動されるべきであるという要件が存在する可能性があります

これを解決するためのビューを提供してください。

4

1 に答える 1

0

フラグ可能な列挙型を使用し、それを渡してチェックインしIsValid()ます。操作を検証する必要がある場合は、検証します。このようなもの:

    public sealed class RequiredAttributeAttribute : Attribute
    {
        private Operation _Operations = Operation.Insert | Operation.Update;
        public Operation Operations
        {
            get { return this._Operations; }
            set { this._Operations = value; }
        }

        public string ErrorMessage { get; set; }
    }

    [Flags]
    public enum Operation
    {
        Insert = 2,
        Update = 4,
        Delete = 6
    }

次に、次のように小道具を検証します。

        void delete()
        {
            this.IsValid(Operation.Delete);
        }


        public bool IsValid(Operation operation)
        {
            //...
        }
于 2013-09-09T09:22:40.897 に答える