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.mzph.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;要不…