首頁 後端開發 C#.Net教程 C#中使用反射以及特性簡化的實例程式碼

C#中使用反射以及特性簡化的實例程式碼

Sep 06, 2017 pm 01:48 PM
.net 簡化

假設現在有一個學生類別(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是取得不到的

以上是C#中使用反射以及特性簡化的實例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C#的就業前景如何 C#的就業前景如何 Oct 19, 2023 am 11:02 AM

無論您是初學者還是有經驗的專業人士,掌握C#將為您的職業發展鋪平道路。

分享幾個.NET開源的AI和LLM相關專案框架 分享幾個.NET開源的AI和LLM相關專案框架 May 06, 2024 pm 04:43 PM

當今人工智慧(AI)技術的發展如火如荼,它們在各個領域都展現了巨大的潛力和影響力。今天大姚給大家分享4個.NET開源的AI模型LLM相關的專案框架,希望能為大家提供一些參考。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel是一種開源的軟體開發工具包(SDK),旨在將大型語言模型(LLM)如OpenAI、Azure

numpy轉list:簡化資料處理流程的有效策略 numpy轉list:簡化資料處理流程的有效策略 Jan 19, 2024 am 10:47 AM

在資料處理和機器學習的應用中,NumPy是一個十分有用且廣泛使用的函式庫。 NumPy的一個重要特點是在Python中提供了大量針對陣列和矩陣進行數學運算的工具函數,這使得NumPy成為了科學計算領域的重要工具。然而,在許多情況下,我們需要將NumPy數組轉換為Python列表(或其它類似資料類型),以便更好地在我們的程式碼中使用。雖然NumPy數組在許多方面都比P

面向開發人員的.NET效能最佳化技術 面向開發人員的.NET效能最佳化技術 Sep 12, 2023 am 10:43 AM

如果你是.NET開發者,你必須意識到在交付高品質軟體方面,優化功能和效能的重要性。透過熟練使用提供的資源並減少網站載入時間,你不僅為使用者創造了愉快的體驗,還能減少基礎設施成本。

Java框架與.NET框架的效能差異 Java框架與.NET框架的效能差異 Jun 03, 2024 am 09:19 AM

在高並發請求處理方面,.NETASP.NETCoreWebAPI效能優於JavaSpringMVC,原因包括:AOT提前編譯,減少啟動時間;更精細的記憶體管理,由開發人員負責分配和釋放物件記憶體。

PHP 箭頭函數:如何簡化迴圈處理 PHP 箭頭函數:如何簡化迴圈處理 Sep 13, 2023 am 08:15 AM

PHP箭頭函數:如何簡化循環處理,需要具體程式碼範例引言:隨著PHP7.4版本的發布,箭頭函數成為了PHP中一個很有趣的新特性。箭頭函數的出現讓我們在處理迴圈時變得更簡潔方便。本文將介紹箭頭函數的基本語法和如何利用箭頭函數簡化循環處理的操作,並給出具體的程式碼範例。箭頭函數的基本語法箭頭函數的語法非常簡單,可以將其視為匿名函數的一種快捷寫法。它的語法結構

C#.NET面試問題和答案:提高您的專業知識 C#.NET面試問題和答案:提高您的專業知識 Apr 07, 2025 am 12:01 AM

C#.NET面試問題和答案包括基礎知識、核心概念和高級用法。 1)基礎知識:C#是微軟開發的面向對象語言,主要用於.NET框架。 2)核心概念:委託和事件允許動態綁定方法,LINQ提供強大查詢功能。 3)高級用法:異步編程提高響應性,表達式樹用於動態代碼構建。

C#.NET:探索核心概念和編程基礎知識 C#.NET:探索核心概念和編程基礎知識 Apr 10, 2025 am 09:32 AM

C#是一種現代、面向對象的編程語言,由微軟開發並作為.NET框架的一部分。 1.C#支持面向對象編程(OOP),包括封裝、繼承和多態。 2.C#中的異步編程通過async和await關鍵字實現,提高應用的響應性。 3.使用LINQ可以簡潔地處理數據集合。 4.常見錯誤包括空引用異常和索引超出範圍異常,調試技巧包括使用調試器和異常處理。 5.性能優化包括使用StringBuilder和避免不必要的裝箱和拆箱。

See all articles