c#的反射和特性

在 C# 中,反射(Reflection)和特性(Attributes)是兩個強大的功能,它們在運行時提供元編程能力,廣泛用于框架開發、對象映射和動態行為擴展。以下是對它們的詳細介紹,包括定義、用法、示例和應用場景。


一、反射(Reflection)

什么是反射?

反射是 C# 運行時的一種機制,允許程序在運行時動態檢查和操作類型、對象及其元數據(如類、方法、屬性等)。通過反射,開發者可以:

  • 獲取類型信息(如類名、方法名)。
  • 動態創建對象。
  • 調用方法或訪問屬性/字段。
  • 檢查或修改私有成員(需注意權限)。

反射的核心類庫位于 System.Reflection 命名空間。


反射的核心類和方法

  1. Type

    • 表示類型的元數據,是反射的核心。
    • 獲取方式:
      • typeof(ClassName):靜態獲取類型。
      • object.GetType():從實例獲取類型。
  2. Assembly

    • 表示程序集,可以加載和檢查 DLL 或 EXE。
  3. MethodInfoPropertyInfoFieldInfo

    • 分別表示方法、屬性和字段的元數據。
  4. Activator

    • 用于動態創建對象實例。

示例 1:基本反射操作

using System;
using System.Reflection;class Person
{public string Name { get; set; }private int age = 25;public void SayHello(){Console.WriteLine($"Hello, I'm {Name}, {age} years old.");}
}class Program
{static void Main(){// 獲取類型Type type = typeof(Person);Console.WriteLine($"類名: {type.Name}");// 創建實例object instance = Activator.CreateInstance(type);// 設置屬性PropertyInfo nameProp = type.GetProperty("Name");nameProp.SetValue(instance, "Alice");// 獲取私有字段并修改FieldInfo ageField = type.GetField("age", BindingFlags.NonPublic | BindingFlags.Instance);ageField.SetValue(instance, 30);// 調用方法MethodInfo method = type.GetMethod("SayHello");method.Invoke(instance, null);// 輸出所有公共方法Console.WriteLine("\n公共方法:");foreach (MethodInfo m in type.GetMethods(BindingFlags.Public | BindingFlags.Instance)){Console.WriteLine(m.Name);}}
}
輸出
類名: Person
Hello, I'm Alice, 30 years old.公共方法:
get_Name
set_Name
SayHello
ToString
Equals
GetHashCode
GetType
說明
  • typeof:獲取 Person 的類型信息。
  • Activator.CreateInstance:動態創建實例。
  • GetPropertySetValue:訪問和修改屬性。
  • GetField:通過 BindingFlags 獲取私有字段。
  • Invoke:動態調用方法。

示例 2:加載程序集

using System;
using System.Reflection;class Program
{static void Main(){// 加載當前程序集Assembly assembly = Assembly.GetExecutingAssembly();foreach (Type type in assembly.GetTypes()){Console.WriteLine($"類型: {type.FullName}");}}
}
輸出
類型: Program
說明
  • Assembly.GetExecutingAssembly:獲取當前程序集。
  • GetTypes:列出程序集中所有類型。

反射的優缺點

  • 優點
    • 動態性:運行時決定行為,適合插件系統或框架。
    • 靈活性:無需提前知道類型即可操作。
  • 缺點
    • 性能開銷:反射比直接調用慢。
    • 安全性:可能暴露私有成員,需謹慎使用。

二、特性(Attributes)

什么是特性?

特性是 C# 中的一種聲明性標簽,用于為代碼元素(如類、方法、屬性等)附加元數據。特性在運行時可以通過反射讀取,用于控制行為或提供額外信息。

特性定義在 System 命名空間中,常用基類是 Attribute


特性的定義與使用

  1. 定義特性

    • 繼承自 Attribute,添加 [AttributeUsage] 指定適用范圍。
  2. 應用特性

    • 使用方括號 [ ] 標記在代碼元素上。
  3. 讀取特性

    • 通過反射的 GetCustomAttributes 方法獲取。

示例 1:自定義特性

using System;
using System.Reflection;// 定義特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class DescriptionAttribute : Attribute
{public string Description { get; }public DescriptionAttribute(string description){Description = description;}
}// 使用特性
[Description("這是一個測試類")]
class TestClass
{[Description("這是一個測試方法")]public void TestMethod(){Console.WriteLine("Hello from TestMethod!");}
}class Program
{static void Main(){// 獲取類特性Type type = typeof(TestClass);DescriptionAttribute classAttr = (DescriptionAttribute)Attribute.GetCustomAttribute(type, typeof(DescriptionAttribute));Console.WriteLine($"類描述: {classAttr?.Description}");// 獲取方法特性MethodInfo method = type.GetMethod("TestMethod");DescriptionAttribute methodAttr = (DescriptionAttribute)method.GetCustomAttribute(typeof(DescriptionAttribute));Console.WriteLine($"方法描述: {methodAttr?.Description}");// 調用方法object instance = Activator.CreateInstance(type);method.Invoke(instance, null);}
}
輸出
類描述: 這是一個測試類
方法描述: 這是一個測試方法
Hello from TestMethod!
說明
  • [AttributeUsage]:限制特性只能用于類和方法,且不可重復。
  • GetCustomAttribute:獲取指定類型的特性實例。
  • Description:特性中存儲的元數據。

示例 2:內置特性 - [Obsolete]

using System;class Program
{[Obsolete("此方法已過時,請使用 NewMethod", false)] // false 表示警告,true 表示錯誤static void OldMethod(){Console.WriteLine("Old Method");}static void NewMethod(){Console.WriteLine("New Method");}static void Main(){OldMethod(); // 編譯器會發出警告NewMethod();}
}
輸出(帶警告)
Old Method
New Method
說明
  • [Obsolete]:標記方法為過時,編譯時提示開發者。

特性的應用場景

  1. 框架開發

    • ASP.NET Core 使用 [Route][HttpGet] 等特性定義路由和行為。
    • Entity Framework 使用 [Table][Key] 配置數據庫映射。
  2. 驗證與描述

    • [Required][MaxLength] 用于數據驗證。
    • [Description] 添加文檔信息。
  3. 條件編譯

    • [Conditional("DEBUG")] 在特定條件下執行方法。

反射與特性的結合

反射和特性經常一起使用,例如:

  • 依賴注入:通過反射掃描帶有特定特性的類,動態注入。
  • 序列化:檢查 [Serializable] 或自定義特性,決定序列化字段。

優缺點

  • 優點
    • 聲明式編程:減少硬編碼,提高可維護性。
    • 元數據豐富:為工具和框架提供信息。
  • 缺點
    • 運行時開銷:讀取特性需要反射。
    • 復雜度:過度使用可能使代碼難以理解。

總結

  • 反射:運行時動態操作類型和對象,適合需要靈活性的場景(如插件系統)。
  • 特性:為代碼添加元數據,配合反射實現聲明式邏輯(如框架配置)。

通過反射,你可以動態調用方法或創建實例;通過特性,你可以為代碼附加規則或描述。這兩者在 C# 中是構建高級功能(如 ORM、AOP)的基石。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899760.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899760.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云終端的作用,此刻在校園和醫院里具象化

數字化轉型已經成為各行各業交流的熱點話題,校園和醫院這兩個重要領域正經歷著深刻變革。云終端,正以實際應用成果展現其獨特作用,讓人們切實感受到它帶來的高效與便利。 傳統的教學中,學校機房的電腦設備更新換代成本高&#xf…

UniApp快速表單組件

環境&#xff1a;vue3 uni-app 依賴庫&#xff1a;uview-plus、dayjs 通過配置項快速構建 form 表單 使用 <script setup>import CustomCard from /components/custom-card.vue;import { ref } from vue;import CustomFormItem from /components/form/custom-form-it…

Android: Handler 的用法詳解

Android 中 Handler 的用法詳解 Handler 是 Android 中用于線程間通信的重要機制&#xff0c;主要用于在不同線程之間發送和處理消息。以下是 Handler 的全面用法指南&#xff1a; 一、Handler 的基本原理 Handler 基于消息隊列(MessageQueue)和循環器(Looper)工作&#xff…

UE5學習筆記 FPS游戲制作33 游戲保存

文章目錄 核心思想創建數據對象創建UIUI參數和方法打開UI存檔文件的位置可以保存的數據類型 核心思想 UE自己有保存游戲的功能&#xff0c;核心節點&#xff0c;類似于json操作&#xff0c;需要一個數據類的對象來進行保存和讀取 創建存檔 加載存檔 保存存檔 創建數據對象…

【藍橋杯】 枚舉和模擬練習題

系列文章目錄 藍橋杯例題 枚舉和模擬 文章目錄 系列文章目錄前言一、好數&#xff1a; 題目參考&#xff1a;核心思想&#xff1a;代碼實現&#xff1a; 二、藝術與籃球&#xff1a; 題目參考&#xff1a;核心思想&#xff1a;代碼實現: 總結 前言 今天距離藍橋杯還有13天&…

大數據技術之Scala:特性、應用與生態系統

摘要 Scala 作為一門融合面向對象編程與函數式編程范式的編程語言&#xff0c;在大數據領域展現出獨特優勢。本文深入探討 Scala 的核心特性&#xff0c;如函數式編程特性、類型系統以及與 Java 的兼容性等。同時&#xff0c;闡述其在大數據處理框架&#xff08;如 Apache Spa…

Linux信號——信號的產生(1)

注&#xff1a;信號vs信號量&#xff1a;兩者沒有任何關系&#xff01; 信號是什么&#xff1f; Linux系統提供的&#xff0c;讓用戶&#xff08;進程&#xff09;給其他進程發送異步信息的一種方式。 進程看待信號的方式&#xff1a; 1.信號在沒有發生的時候&#xff0c;進…

數據結構和算法——漢諾塔問題

前言 先講個故事&#xff0c;傳說古代印度有三根黃金柱&#xff0c;64個石盤&#xff0c;需要將石盤從第一根移動到第三根上&#xff0c;規定每次只能移動一片&#xff0c;并且小盤在放置時必須在大盤上。 當石盤移動完畢時&#xff0c;世界就會毀滅。 漢諾塔——遞歸 接下來…

2023年3月全國計算機等級考試真題(二級C語言)

&#x1f600; 第1題 下列敘述中錯誤的是 A. 向量是線性結構 B. 非空線性結構中只有一個結點沒有前件 C. 非空線性結構中只有一個結點沒有后件 D. 只有一個根結點和一個葉子結點的結構必定是線性結構 概念澄清 首先&#xff0c;我們需要明確幾個關鍵概念&#xf…

Kafka簡單的性能調優

Kafka 的性能調優是一個系統性工程&#xff0c;需要從生產者、消費者、Broker 配置以及集群架構等多個層面進行綜合調整。以下是一些關鍵的性能調優策略&#xff1a; 一、生產者性能優化 批量發送 batch.size&#xff1a;控制消息批量的最大字節數&#xff0c;默認值為 16KB。…

微前端 - 以無界為例

一、微前端核心概念 微前端是一種將單體前端應用拆分為多個獨立子應用的架構模式&#xff0c;每個子應用可獨立開發、部署和運行&#xff0c;具備以下特點&#xff1a; 技術棧無關性&#xff1a;允許主應用和子應用使用不同框架&#xff08;如 React Vue&#xff09;。獨立部…

企業級日志分析平臺: ELK 集群搭建指南

前言&#xff1a;在當今數字化時代&#xff0c;數據已經成為企業決策的核心驅動力。無論是日志分析、用戶行為追蹤&#xff0c;還是實時監控和異常檢測&#xff0c;高效的數據處理和可視化能力都至關重要。ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;作為全球…

1.2-WAF\CDN\OSS\反向代理\負載均衡

WAF&#xff1a;就是網站應用防火墻&#xff0c;有硬件類、軟件類、云WAF&#xff1b; 還有網站內置的WAF&#xff0c;內置的WAF就是直接嵌在代碼中的安全防護代碼 硬件類&#xff1a;Imperva、天清WAG 軟件&#xff1a;安全狗、D盾、云鎖 云&#xff1a;阿里云盾、騰訊云WA…

MybatisPlus(SpringBoot版)學習第四講:常用注解

目錄 1.TableName 1.1 問題 1.2 通過TableName解決問題 1.3 通過全局配置解決問題 2.TableId 2.1 問題 2.2 通過TableId解決問題 2.3 TableId的value屬性 2.4 TableId的type屬性 2.5 雪花算法 1.背景 2.數據庫分表 ①垂直分表 ②水平分表 1>主鍵自增 2>取…

第二屆計算機網絡和云計算國際會議(CNCC 2025)

重要信息 官網&#xff1a;www.iccncc.org 時間&#xff1a;2025年4月11-13日 地點&#xff1a;中國南昌 簡介 第二屆計算機網絡和云計算國際會議&#xff08;CNCC 2025&#xff09;將于2025年4月11-13日在中國南昌召開。圍繞“計算機網絡”與“云計算”展開研討&#xff…

【大模型基礎_毛玉仁】5.4 定位編輯法:ROME

目錄 5.4 定位編輯法&#xff1a;ROME5.4.1 知識存儲位置1&#xff09;因果跟蹤實驗2&#xff09;阻斷實驗 5.4.2 知識存儲機制5.4.3 精準知識編輯1&#xff09;確定鍵向量2&#xff09;優化值向量3&#xff09;插入知識 5.4 定位編輯法&#xff1a;ROME 定位編輯&#xff1a;…

橫掃SQL面試——連續性登錄問題

橫掃SQL面試 &#x1f4cc; 連續性登錄問題 在互聯網公司的SQL面試中&#xff0c;連續性問題堪稱“必考之王”。&#x1f4bb;&#x1f50d; 用戶連續登錄7天送優惠券&#x1f31f;&#xff0c;服務器連續報警3次觸發熔斷??&#xff0c;圖書館連續3天人流破百開啟限流?” …

Spring AI Alibaba 對話記憶使用

一、對話記憶 (ChatMemory)簡介 1、對話記憶介紹 ”大模型的對話記憶”這一概念&#xff0c;根植于人工智能與自然語言處理領域&#xff0c;特別是針對具有深度學習能力的大型語言模型而言&#xff0c;它指的是模型在與用戶進行交互式對話過程中&#xff0c;能夠追蹤、理解并利…

vdi模式是什么

?VDI模式&#xff08;Virtual Desktop Infrastructure&#xff09;是一種基于服務器的計算模型&#xff0c;其核心思想是將所有計算和存儲資源集中在服務器上&#xff0c;用戶通過前端設備&#xff08;如瘦客戶機&#xff09;訪問服務器上的虛擬桌面?? VDI模式的工作原理 在…

【分布式】深入剖析 Sentinel 限流:原理、實現

在當今分布式系統盛行的時代&#xff0c;流量的劇增給系統穩定性帶來了巨大挑戰。Sentinel 作為一款強大的流量控制組件&#xff0c;在保障系統平穩運行方面發揮著關鍵作用。本文將深入探討 Sentinel 限流的原理、實現方案以及其優缺點&#xff0c;助力開發者更好地運用這一工具…