1. 程式人生 > 其它 >c#特性(Attribute)學習總結2

c#特性(Attribute)學習總結2

技術標籤:c#c#.net特性行為

通過特性提供額外行為的例項:自定義特性做資料驗證(效驗屬性值的大小和非空)

學生類中有個QQ的屬性,效驗QQ不能小於100000(5位數),不能大於999999999999(12位數),並且QQ的屬性不能為空。如果滿足這些效驗返回true,否則返回false。

宣告一個抽象類,所有的自定義特性都繼承自這個抽象類,為了確保自定義特性都實現資料效驗的方法。

    /// <summary>
    /// 抽象類 基類
    /// </summary>
    public abstract class AbstractVaildDataAttribute : Attribute
    {
        /// <summary>
        /// 驗證資料是否符合要求
        /// </summary>
        /// <param name="oValue"></param>
        /// <returns></returns>
        public abstract bool ValidData(object oValue);
    }

宣告效驗屬性非空的特性:

    /// <summary>
    /// 宣告一個可以對屬性應用 空字串效驗的特性
    /// 效驗值是否為空
    /// </summary>
    [AttributeUsage(AttributeTargets.Property)]
    public class RequireAttribute : AbstractVaildDataAttribute
    {
        public override bool ValidData(object oValue)
        {
            return !string.IsNullOrEmpty(oValue.ToString());
        }
    }

宣告效驗屬性值大小的特性:

    /// <summary>
    /// 宣告一個可以對屬性應用LongAttribute的特性
    /// 效驗值的範圍
    /// </summary>
    [AttributeUsage(AttributeTargets.Property)]
    public class LongAttribute : AbstractVaildDataAttribute
    {
        private long _Min = 0;
        private long _Max = 0;

        public LongAttribute(long min, long max)
        {
            _Min = min;
            _Max = max;
        }

        public override bool ValidData(object oValue)
        {
            long lValue = 0;
            return oValue != null && long.TryParse(oValue.ToString(), out lValue) && lValue >= _Min && lValue <= _Max;
        }
    }

宣告一個學生類,並在屬性上面新增上自定義的兩個特性(‘Long’,‘Require’):

 public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }

        [Long(10000, 999999999999)]
        [Require]
        public long QQ { get; set; }

    }

宣告一個擴充套件方法,用於呼叫反射來效驗屬性的值:

        /// <summary>
        /// 效驗屬性的值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        /// <returns></returns>
        public static bool ValidDataExtend<T>(this T t) {
            Type type = t.GetType();
            foreach (var prop in type.GetProperties())
            {
                if (prop.IsDefined(typeof(AbstractVaildDataAttribute),true))
                {
                    object oValue = prop.GetValue(t);//獲取要校驗型別的值
                    object[] oAttributeArr = prop.GetCustomAttributes(typeof(AbstractVaildDataAttribute), true);//獲取所有自定義的特性
                    foreach (AbstractVaildDataAttribute attr in oAttributeArr)
                    {
                        if (!attr.ValidData(oValue))
                        {
                            return false;
                        }
                    }
                }
            }
            return true;
        }

呼叫擴充套件方法,驗證特性效果:

      static void Main(string[] args)
        {
            Student student = new Student()
            {
                Id = 1,
                Name = "張三",
                QQ = 1234565555
            };

            if (student.ValidDataExtend())
            {
                Console.WriteLine("效驗通過");
            }
            else
            {
                Console.WriteLine("效驗不通過");
            }

            Console.ReadKey();
        }

執行結果:

整體實現思路:

1.宣告抽象類(基類)

2.宣告非空效驗特性和數值大小效驗特性

3.在屬性上面應用特性

4.使用反射訪問特性,效驗數值是否符合要求