国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用反射、特性簡化代碼

2019-11-14 13:30:14
字體:
來源:轉載
供稿:網友

假設現在有一個學生類(Student)

    /// <summary>    /// 學生類    /// </summary>    public class Student    {           /// <summary>        /// 名字        /// </summary>        PRivate string name;        public string Name        {            get { return name; }            set { name = value; }        }        /// <summary>        /// 年齡        /// </summary>        public int Age { get; set; }        /// <summary>        /// 地址        /// </summary>        public string Address { get; set; }        /// <summary>        /// 性別        /// </summary>        public string Sex;    }

如果需要判斷某些字段(屬性)是否為空,是否大于0,便有以下代碼:

        public static string ValidateStudent(Student student)        {            StringBuilder validateMessage = new StringBuilder();            if (string.IsNullOrEmpty(student.Name))            {                validateMessage.Append("名字不能為空");            }            if (string.IsNullOrEmpty(student.Sex))            {                validateMessage.Append("性別不能為空");            }            if (student.Age <= 0)            {                validateMessage.Append("年齡必填大于0");            }            //...... 幾百行            // 寫到這里發現不對啊,如果必填項有20多個,難道我要一直這樣寫嗎!            return validateMessage.ToString();        }

這樣的代碼,重用性不高,而且效率低。

我們可以用特性,反射,然后遍歷屬性并檢查特性。

首先自定義一個【必填】特性類,繼承自Attribute

    /// <summary>    /// 【必填】特性,繼承自Attribute    /// </summary>    public sealed class RequireAttribute : Attribute    {        private bool isRequire;        public bool IsRequire        {            get { return isRequire; }        }        /// <summary>        /// 構造函數        /// </summary>        /// <param name="isRequire"></param>        public RequireAttribute(bool isRequire)        {            this.isRequire = isRequire;        }    }

然后用這個自定義的特性標記學生類的成員屬性:

    /// <summary>    /// 學生類    /// </summary>    public class Student    {           /// <summary>        /// 名字        /// </summary>        private string name;        [Require(true)]        public string Name        {            get { return name; }            set { name = value; }        }        /// <summary>        /// 年齡        /// </summary>        [Require(true)]        public int Age { get; set; }        /// <summary>        /// 地址        /// </summary>        [Require(false)]        public string Address { get; set; }        /// <summary>        /// 性別        /// </summary>        [Require(true)]         public string Sex;    }

通過特性檢查類的屬性:

        /// <summary>        /// 檢查方法,支持泛型        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="instance"></param>        /// <returns></returns>        public static string CheckRequire<T>(T instance)        {            var validateMsg = new StringBuilder();            //獲取T類的屬性            Type t = typeof (T);            var propertyInfos = t.GetProperties();            //遍歷屬性            foreach (var propertyInfo in propertyInfos)            {                //檢查屬性是否標記了特性                RequireAttribute attribute = (RequireAttribute) Attribute.GetCustomAttribute(propertyInfo, typeof (RequireAttribute));                //沒標記,直接跳過                if (attribute == null)                {                    continue;                }                //獲取屬性的數據類型                var type = propertyInfo.PropertyType.ToString().ToLower();                //獲取該屬性的值                var value = propertyInfo.GetValue(instance);                if (type.Contains("system.string"))                {                    if (string.IsNullOrEmpty((string) value) && attribute.IsRequire)                        validateMsg.Append(propertyInfo.Name).Append("不能為空").Append(",");                }                else if (type.Contains("system.int"))                {                    if ((int) value == 0 && attribute.IsRequire)                        validateMsg.Append(propertyInfo.Name).Append("必須大于0").Append(",");                }            }            return validateMsg.ToString();        }

執行驗證:

        static void Main(string[] args)        {            var obj = new Student()            {                Name = ""            };            Console.WriteLine(CheckRequire(obj));            Console.Read();        }

結果輸出:

有人會發現,Sex也標記了[Require(true)],為什么沒有驗證信息,這是因為,Sex沒有實現屬性{ get; set; },GetProperties是獲取不到的。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临夏县| 临武县| 尉犁县| 太仆寺旗| 邢台县| 揭西县| 渭南市| 娄底市| 永嘉县| 博湖县| 岳西县| 长垣县| 泸州市| 长春市| 双牌县| 灵寿县| 成安县| 庆阳市| 三江| 龙门县| 嘉兴市| 资讯 | 平山县| 应城市| 铅山县| 宁乡县| 台州市| 乌什县| 安溪县| 杂多县| 凤台县| 大足县| 堆龙德庆县| 共和县| 西藏| 隆林| 河池市| 信阳市| 屏山县| 高阳县| 平邑县|