C#中使用反射以及特性簡化的執行個體代碼

來源:互聯網
上載者:User

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


                                    {  { name =                    Age { ;                     Address { ;

如果需要判斷某些欄位(屬性)是否為空白,是否大於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是擷取不到的

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.