C#自定義特性的使用


ref: https://www.cnblogs.com/woadmin/p/9406970.html

特性類的使用過程:

第一步:定義一個特性類,定義一些成員來包含驗證時需要的數據;
第二步:創建特性類實例;
創建一個特性類的實例,里面包含着驗證某一個屬性或者字段需要的數據。
將該實例關聯到某個屬性上面。
第三步:使用特性類實例
可以通過調用某個類型的GetProperties()方法,獲取屬性,
然后調用類型屬性成員的GetCustomAttributes()方法,獲取該屬性關聯的特性類實例,
然后使用查找到的特性類實例驗證新建對象。

 

第一步:定義特性類
image

第二步:創建一個特性類的實例,並關聯一個屬性

public class Order
    {
        [StringLength("訂單號", 6, MinLength = 3, ErrorMessage = "{0}的長度必須在{1}和{2}之間!")]//實例化一個特性類,關聯到一個字段上面
        public string OrderID { get; set; }
    }

 

第三步:使用特性類實例,進行驗證

復制代碼
class Program
    {
        #region 使用特性類的過程

        //驗證過程
        //1.通過映射,找到成員屬性關聯的特性類實例,
        //2.使用特性類實例對新對象的數據進行驗證

        //用特性類驗證訂單號長度
        public static bool isIDLengthValid(int IDLength, MemberInfo member)
        {
            foreach (object attribute in member.GetCustomAttributes(true)) //2.通過映射,找到成員屬性上關聯的特性類實例,
            {
                if (attribute is StringLengthAttribute)//3.如果找到了限定長度的特性類對象,就用這個特性類對象驗證該成員
                {
                    StringLengthAttribute attr = (StringLengthAttribute)attribute;
                    if (IDLength < attr.MinLength || IDLength > attr.MaxLength)
                    {
                        string displayName = attr.DisplayName;
                        int maxLength = attr.MaxLength;
                        int minLength = attr.MinLength;
                        string error = attr.ErrorMessage;
                        Console.WriteLine(error, displayName,maxLength, minLength);//驗證失敗,提示錯誤
                        return false;
                    }
                    else return true;
                }
               
            }
            return false;
        }


        //驗證訂單對象是否規范
        public static bool isOrderValid(Order order)
        {
            if (order == null) return false;
            foreach (PropertyInfo p in typeof(Order).GetProperties())
            {
                if (isIDLengthValid(order.OrderID.Length, p))//1記錄下新對象需要驗證的數據,
                    return true;
            }
            return false;

        }
        #endregion
        public static void Main()
        {
            Order order=new Order();
            do
            {
                Console.WriteLine("請輸入訂單號:");
                 order.OrderID= Console.ReadLine();
            }
            while (!isOrderValid(order));
            Console.WriteLine("訂單號輸入正確,按任意鍵退出!");
            Console.ReadKey();
        }

    }
復制代碼

 

總結:特性類的實例里沒有驗證邏輯,只有驗證用到的規范數據(比如字符串長度)、提示信息等。驗證邏輯需要自己寫。

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM