特性應用

特性:是一個類,用來標記元素,編譯時生成到metadata裏面,平時不影響程序的運行,除非主動用反射區查找,可以得到一些額外的信息/操作,提供了更豐富的擴展空間。

示例代碼如下:

 class Program
    {
        static void Main(string[] args)
        {
            ///獲取枚舉描述
            {
                string userState = UserState.Frozen.GetRemark();
                Console.WriteLine(userState);
            }
            //校驗數據
            {
                Student student = new Student() { Score = 90 };
                bool b = DataVaildate.Validate<Student>(student);
                student.Score = -1;
                b = DataVaildate.Validate<Student>(student);
            }
            Console.ReadKey();
        }
    }
    /// <summary>
    /// 擴展方法
    ///     1、靜態類
    ///     2、靜態方法
    ///     3、第一個參數類型前加this
    /// </summary>
    public static class EnumExtend
    {
        public static string GetRemark(this Enum enumValue)
        {
            Type type = enumValue.GetType();
            FieldInfo fieldInfo = type.GetField(enumValue.ToString());
            if (fieldInfo.IsDefined(typeof(RemarkAttribute), true))
            {
                RemarkAttribute remarkAttribute = (RemarkAttribute)fieldInfo.GetCustomAttribute(typeof(RemarkAttribute), true);
                return remarkAttribute.Remark;
            }
            else
            {
                return enumValue.ToString();
            }
        }
    }
    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = true)]//修飾特性的特性
    public class RemarkAttribute : Attribute//Remark特性
    {
        public string Remark { get; private set; }
        public RemarkAttribute(string remark)
        {
            this.Remark = remark;
        }
    }
    /// <summary>
    /// 校驗特性的父類
    /// </summary>
    public abstract class AbstractValidateAttribute : Attribute
    {
        public abstract bool Validate(object oValue);
    }
    /// <summary>
    /// Long取值範圍校驗特性
    /// </summary>
    public class LongValidateAttribute : AbstractValidateAttribute
    {
        private long _lMin = 0;//最小值
        private long _lMax = 0;//最大值

        public LongValidateAttribute(long lMin, long lMax)
        {
            this._lMin = lMin;
            this._lMax = lMax;
        }
        public override bool Validate(object oValue)
        {
            return this._lMin <= (long)oValue && (long)oValue <= this._lMax;
        }
    }
    public enum UserState
    {
        [Remark("正常")]
        Normal = 0,
        [Remark("凍結")]
        Frozen = 1,
        [Remark("刪除")]
        Deleted = 2
    }
    public class Student
    {
        [LongValidate(0, 100)]
        public long Score { get; set; }
    }

    public class DataVaildate
    {
        public static bool Validate<T>(T t)
        {
            Type type = t.GetType();//獲取傳入參數的類型
            foreach (var prop in type.GetProperties())//遍歷屬性
            {
                if (prop.IsDefined(typeof(AbstractValidateAttribute), true))//判斷屬性是否定義了校驗的特性
                {
                    AbstractValidateAttribute abstractValidateAttribute = (AbstractValidateAttribute)prop.GetCustomAttribute(typeof(AbstractValidateAttribute), true);//獲取到需要校驗的特性
                    if (!abstractValidateAttribute.Validate(prop.GetValue(t)))//校驗
                    {
                        return false;
                    }
                }
            }
            return true;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章