C# MethodBase 類使用詳解

總目錄


前言

在C#編程中,反射(Reflection)是一種強大的機制,允許我們在運行時檢查和操作類型的成員。MethodBase 類是.NET框架中 System.Reflection 命名空間下的一個抽象類,它是所有方法( MethodInfoConstructorInfo )的基類,包括實例方法和靜態方法。通過 MethodBase,我們可以獲取方法的元數據,如方法名稱、返回類型、參數等。本文將詳細講解 MethodBase 類的使用方法、核心功能以及注意事項。


一、什么是 MethodBase 類?

1. 定義

MethodBase 類是 System.Reflection 命名空間中的一個抽象類,繼承自 MemberInfo,是 MethodInfo(表示方法)和 ConstructorInfo(表示構造函數)的基類。通過 MethodBase,我們可以獲取方法的元數據,如方法名稱、返回類型、參數等。

2. 核心功能

  • 獲取方法或構造函數的元數據:如方法名稱、參數列表、返回類型、訪問修飾符等。
  • 判斷方法或構造函數的特性:如是否為靜態方法、虛方法、抽象方法等。
  • 支持動態調用方法或構造函數(通過派生類 MethodInfoConstructorInfo)。

3. 與 MethodInfoConstructorInfo 的區別

  • MethodBase 是基類:提供通用方法和屬性,但無法直接調用方法或構造函數。
  • MethodInfo 是派生類:提供 Invoke 方法等具體功能,用于操作方法。
  • ConstructorInfo 是派生類:用于操作構造函數,如創建對象實例:
    ConstructorInfo ctor = typeof(MyClass).GetConstructor(Type.EmptyTypes);
    object instance = ctor.Invoke(new object[] { });
    

4. MethodBase 的核心屬性與方法

1)核心屬性

屬性名描述
Name獲取方法或構造函數的名稱。
DeclaringType獲取聲明該方法或構造函數的類型。
IsPublic判斷方法或構造函數是否為公共的。
IsPrivate判斷方法或構造函數是否為私有的。
IsStatic判斷方法或構造函數是否為靜態的。
IsVirtual判斷方法是否為虛方法。
IsAbstract判斷方法是否為抽象方法。
IsConstructor判斷當前對象是否為構造函數。
ReflectedType獲取用于獲取 MethodBase 實例的類型。
Attributes獲取方法或構造函數的特性。

2)核心方法

方法名描述
GetCustomAttributes獲取應用到方法或構造函數的自定義特性。
GetParameters獲取方法的參數信息(通過 MethodInfo 派生調用)。
Invoke動態調用方法。
GetMethod獲取特定的方法信息。
GetCurrentMethod獲取當前的方法信息。

二、MethodBase 的使用

1. 獲取當前執行的方法

public void MyMethod()
{MethodBase currentMethod = MethodBase.GetCurrentMethod();Console.WriteLine($"Current Method: {currentMethod.Name}"); // 輸出: MyMethod
}

2. 獲取方法的基本信息

using System;
using System.Reflection;class Program
{static void Main(){MethodBase currentMethod = MethodBase.GetCurrentMethod();Console.WriteLine("方法名稱:" + currentMethod.Name);Console.WriteLine("聲明類型:" + currentMethod.DeclaringType);Console.WriteLine("反射類型:" + currentMethod.ReflectedType);Console.WriteLine("是否為靜態方法:" + currentMethod.IsStatic);Console.WriteLine("是否為公共方法:" + currentMethod.IsPublic);}
}

3. 獲取方法參數

public class MyClass
{public void MyMethod(string name, int age = 30, bool isStudent = false){Console.WriteLine($"Name: {name}, Age: {age}, IsStudent: {isStudent}");}
}
internal class Program
{static void Main(string[] args){MethodInfo method = typeof(MyClass).GetMethod("MyMethod");ParameterInfo[] parameterInfos= method.GetParameters();foreach (var item in parameterInfos){Console.WriteLine($"類型:{item.ParameterType}\t 名稱:{item.Name}");}}
}

輸出結果:

類型:System.String      名稱:name
類型:System.Int32       名稱:age
類型:System.Boolean     名稱:isStudent

3. 獲取MethodBase 對象

由于 MethodBaseMethodInfoConstructorInfo 的基類,因此通過GetMethod / GetMethods 以及 GetConstructor/GetConstructors 都可以間接獲取得到MethodBase

1)GetMethod 方法

GetMethod 方法:用于獲取單個方法,可以根據方法名稱和參數類型精確匹配。

Type personType = typeof(Person);
MethodInfo sayHelloMethod = personType.GetMethod("SayHello", new Type[] { typeof(string) });

如果需要使用到 派生類 MethodInfo中的功能,還是推薦使用MethodInfo

using System;
using System.Reflection;class Program
{static void Main(){Type type = typeof(Program);MethodInfo method = type.GetMethod("MyMethod");//同樣可以使用MethodBase接收,但可以導致無法使用MethodInfo中的功能,如ReturnType//MethodInfo method = type.GetMethod("MyMethod");Console.WriteLine("方法名稱:" + method.Name);Console.WriteLine("返回類型:" + method.ReturnType);Console.WriteLine("參數數量:" + method.GetParameters().Length);}public static void MyMethod(int param1, string param2){// 方法體}
}

2)GetMethods 方法

GetMethods 方法:用于獲取所有方法,返回一個 MethodInfo 對象的數組。

  MethodInfo[] methods = personType.GetMethods();// 同樣可以使用 MethodBase 接收// MethodBase[] methods = personType.GetMethods();  

4. 動態調用方法(通過 MethodInfo

using System;
using System.Reflection;class Program
{static void Main(){Type type = typeof(Program);MethodInfo method = type.GetMethod("MyMethod");object result = method.Invoke(null, new object[] { 10, "Hello" });Console.WriteLine("方法返回值:" + result);}public static int MyMethod(int param1, string param2){Console.WriteLine("參數1:" + param1);Console.WriteLine("參數2:" + param2);return param1;}
}

三、注意事項與最佳實踐

  • 靜態方法與實例方法調用:對于靜態方法,調用 Invoke 時第一個參數傳 null,對于實例方法,傳入實例對象。
  • 參數匹配:調用 Invoke 方法時,必須確保傳遞的參數類型和數量與方法的簽名匹配,否則會拋出異常。
  • 訪問修飾符:調用非公共方法時,需要使用 BindingFlags 指定訪問修飾符,否則 GetMethod 方法可能無法找到該方法。
  • 性能開銷:反射操作比直接調用慢,高頻場景需謹慎使用,或通過緩存 MethodBase 實例優化。
  • 可讀性和維護性:過度使用反射可能導致代碼可讀性下降和維護難度增加。

結語

回到目錄頁:C#/.NET 知識匯總
希望以上內容可以幫助到大家,如文中有不對之處,還請批評指正。


參考資料:

  • .NET 反射基礎教程
  • MethodBase 類文檔
  • MethodInfo vs. ConstructorInfo

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

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

相關文章

【css酷炫效果】純CSS實現3D翻轉卡片動畫

【css酷炫效果】純CSS實現3D翻轉卡片動畫 緣創作背景html結構css樣式完整代碼效果圖 想直接拿走的老板,鏈接放在這里:https://download.csdn.net/download/u011561335/90490472 緣 創作隨緣,不定時更新。 創作背景 剛看到csdn出活動了&am…

Flask多參數模版使用

需要建立目錄templates; 把建好的html文件放到templates目錄里面; 約定好參數名字,單個名字可以直接使用;多參數使用字典傳遞; 樣例: from flask import render_template # 模板 (Templates) #Flask 使用…

SVN簡明教程——下載安裝使用

SVN教程目錄 一、開發中的實際問題二、簡介2.1 版本控制2.2 Subversion2.3 Subversion的優良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安裝與配置1. 服務器端程序版本2. 下載源碼包3. 下載二進制安裝包4. 安裝5. 配置版本庫① 為什么要配置版本庫?② 創建目…

OpenCV圖像拼接(1)概述

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 此圖說明了在Stitcher類中實現的拼接模塊流程。使用該類,可以配置/移除某些步驟,即根據特定需求調整拼接流程。流程中的所…

Ubuntu20.04安裝Nvidia顯卡驅動

Ubuntu20.04安裝Nvidia顯卡驅動 安裝環境為Dell R540服務器 官網下載Nvidia顯卡驅動 https://www.nvidia.cn/geforce/drivers/ 安裝顯卡驅動 chmod x NVIDIA-Linux-x86_64-470.63.01.run sudo ./NVIDIA-Linux-x86_64-470.63.01.run 遇到nouveau報錯 lsmod查看nouveau驅動…

互聯網it常用抓包工具說明

一、引言 在互聯網 IT 領域,無論是網絡故障排查、安全檢測,還是開發調試,抓包工具都發揮著舉足輕重的作用。 當網絡出現故障,比如網頁加載緩慢、應用無法連接服務器時,抓包工具可以幫助我們捕獲網絡數據包&#xff0…

Linux 音頻驅動 WM8960 音頻 DAC IC 音樂播放與錄音

這些先引出一個內容,是 Linux 內核的音頻系統,ALSA,提供了對聲卡的低級訪問,支持 PCM,播放/錄音、混音、MIDI 處理等功能。它取代了舊的 OSS,并提供更強大的功能和更好的硬件支持。 ALSA 主要特點&#xf…

k8s中的組件

1.namespace Namespace 用于將集群資源劃分為不同的邏輯組&#xff0c;方便管理和隔離 kubectl get namespace 查看所有邏輯組 kubectl describe namespace <namespace-name> 查看某個邏輯組信息詳情 kubectl create namespace ... 創建邏輯組 kubectl delete names…

OpenHarmony 開源鴻蒙北向開發——3.配置SDK

安裝、配置完成之后我們就要配置SDK。 我們創建工程后&#xff0c;點擊右上角設置 進入設置 進入OpenHarmony SDK&#xff0c;選擇編輯 這里配置一下SDK安裝位置 點擊完成 這里我們API版本勾選第一個即可 確認安裝 勾選接受 這里要等一會 安裝完成后&#xff0c;點擊完成

5.2《生活中的透鏡》——5.3《凸透鏡成像規律》講后再上

教會什么:照相機、投影儀、放大鏡的原理 培養什么:(再說) 課標: (二)運動和相互作用 2.3 聲和光 2.3.5了解凸透鏡成像規律的應用。 例7 了解凸透鏡成像規律在放大鏡、照相機中的應用。 一、導入 提問:生活中有哪些透鏡?(放大鏡、照相機、投影儀/幻燈機) ——直接提出…

怎么用LoRA的低秩結構近似Fisher矩陣

怎么用LoRA的低秩結構近似Fisher矩陣 目錄 怎么用LoRA的低秩結構近似Fisher矩陣**1. Fisher矩陣的內存挑戰****2. LoRA的低秩結構與Fisher近似****3. 具體實現步驟****4. 示例說明****5. 有效性分析****6. 擴展與優化****總結**在LoRA(低秩適應)中,通過低秩結構近似Fisher矩…

C#通過API接口返回流式響應內容---SignalR方式

1、背景 在上兩篇《C#通過API接口返回流式響應內容—分塊編碼方式》和《C#通過API接口返回流式響應內容—SSE方式》實現了流式響應的內容。 上面的這兩個主要是通過HTTP的一些功能&#xff0c;除了這些之外&#xff0c;還有WebSocket的方式。C#中的WebSocket的有比較多的方案&…

Redis 跳表原理詳解

一、引言 在 Redis 中&#xff0c;有序集合&#xff08;Sorted Set&#xff09;是一種非常重要的數據結構&#xff0c;它可以實現元素的有序存儲和高效查找。而實現有序集合的底層數據結構之一就是跳表&#xff08;Skip List&#xff09;。跳表是一種隨機化的數據結構&#xff…

識別并脫敏上傳到deepseek/chatgpt的文本文件中的身份證/手機號

本文將介紹一種簡單高效的方法解決用戶在上傳文件到DeepSeek、ChatGPT,文心一言,AI等大語言模型平臺過程中的身份證號以及手機號等敏感數據識別和脫敏問題。 DeepSeek、ChatGPT,Qwen,Claude等AI平臺工具快速的被接受和使用,用戶每天上傳的文本數據中潛藏著大量敏感信息,…

Spring 如何創建 Bean 實例的?

Spring 創建 Bean 實例的過程主要由 BeanFactory 接口及其實現類&#xff08;通常是 AbstractBeanFactory 的 doGetBean 方法和 DefaultListableBeanFactory 的 preInstantiateSingletons 方法&#xff09;負責。這個過程涉及多個步驟&#xff0c;包括 Bean 定義的解析、依賴的…

第六:go 操作 redis-go

Redis 在項目開發中redis的使用也比較頻繁&#xff0c;本文介紹了Go語言中go-redis庫的基本使用。 Redis介紹 Redis是一個開源的內存數據庫&#xff0c;Redis提供了多種不同類型的數據結構&#xff0c;很多業務場景下的問題都可以很自然地映射到這些數據結構上。除此之外&am…

【RabbitMQ】RabbitMQ如何保證消息不丟失?

為了保證消息不丟失&#xff0c;需要在生產者、RabbitMQ本身和消費者三個環節采取相應措施。 1.生產者端&#xff1a;確保消息發送成功 1.1開啟消息確認機制(Publisher Confirms) 原理&#xff1a; 生產者發送消息后&#xff0c;RabbitMQ會返回一個確認(ACK),表示消息已成功…

fastapi+angular外賣系統

說明&#xff1a; fastapiangular外賣系統 1.美食分類&#xff08;粥&#xff0c;粉&#xff0c;面&#xff0c;炸雞&#xff0c;炒菜&#xff0c;西餐&#xff0c;奶茶等等&#xff09; 2.商家列表 &#xff08;kfc&#xff0c;蘭州拉面&#xff0c;湘菜館&#xff0c;早餐店…

Kafka-Exporter 9308端口啟用TLS認證的完整指南

#作者&#xff1a;張桐瑞 文章目錄 1 方案描述2 涉及版本3 使用CA自簽證書3.1一鍵生成證書腳本3.1.1證書腳本3.1.2執行結果 3.2分步自建證書過程3.2.1生成CA私鑰3.2.2生成CA自簽名證書3.2.3生成服務器私鑰和證書申請文件CRS 3.3最終的文件列表 4 Exporter啟動命令4.1參數說明 …

NFS共享搭建

準備工作 首先確保已經建了兩臺虛擬機&#xff0c;都是橋接模式&#xff0c;一臺是windows server 2019 一臺是centos7 用戶配額教程,是在windows server 2019中&#xff0c;先新建虛擬池&#xff0c;然后創建虛擬磁盤&#xff0c;記得添加磁盤類型要選擇第三個&#xff0c;要不…