C#的反射(Reflection)是什么?如何动态获取类型信息并调用方法?

夜强同学_5171

夜强同学_5171

2025-11-22

977人浏览

原创

通过反射可动态获取类型信息、创建对象并调用成员。使用 typeof 或 gettype() 获取 type 对象,查询名称、命名空间等元数据;通过 activator.createinstance 创建实例,支持无参或有参构造函数;利用 getmethod 获取 methodinfo 后调用方法,配合 bindingflags 可访问私有成员;propertyinfo 和 fieldinfo 分别用于读写属性与字段值;反射性能较低,建议缓存 type 和 methodinfo 或结合委托优化。

c#的反射(reflection)是什么?如何动态获取类型信息并调用方法?

反射(Reflection) 是 C# 提供的一种强大机制,允许程序在运行时动态获取类型信息、创建对象、调用方法、访问字段和属性等,而不需要在编译时知道这些类型的细节。它通过 System.Reflection 命名空间实现,适用于插件架构、序列化、ORM 框架、依赖注入等场景。

如何使用反射获取类型信息?

你可以通过 typeof、GetType() 或 Type.GetType(string) 获取 Type 对象,进而查询类的结构。

例如:

// 获取类型
Type type = typeof(string);
// 或从实例获取
object obj = "hello";
Type type2 = obj.GetType();
// 或通过字符串名称获取(需完整命名空间)
Type type3 = Type.GetType("System.Collections.Generic.List`1[[System.Int32]]");
<p>// 查看类型信息
Console.WriteLine(type.Name);        // 输出类型名
Console.WriteLine(type.Namespace);   // 命名空间
Console.WriteLine(type.IsClass);     // 是否是类</p>

如何动态创建对象?

使用 Activator.CreateInstance 可以根据 Type 创建实例。

Type type = typeof(List<int>);
var list = Activator.CreateInstance(type);
</int>

如果构造函数有参数,也可以传入:

Api Gateway
Api Gateway

通用API网关,简易配置REST/GraphQL API,支持认证、限流和缓存管理。

下载
Type type = typeof(Student);
var student = Activator.CreateInstance(type, "张三", 20);

如何动态调用方法?

通过 GetMethod 获取 MethodInfo 对象,再用 Invoke 调用方法。

public class Calculator
{
    public int Add(int a, int b) => a + b;
}
<p>// 反射调用 Add 方法
Type calcType = typeof(Calculator);
var calc = Activator.CreateInstance(calcType);</p><p>MethodInfo method = calcType.GetMethod("Add");
var result = method.Invoke(calc, new object[] { 5, 3 }); // 返回 8
Console.WriteLine(result);</p>

支持调用私有方法,只需指定 BindingFlags:

MethodInfo privateMethod = type.GetMethod("PrivateMethod", 
    BindingFlags.NonPublic | BindingFlags.Instance);

访问属性和字段

可以读写属性或字段值:

PropertyInfo prop = type.GetProperty("Name");
prop.SetValue(obj, "李四");
string name = (string)prop.GetValue(obj);
<p>FieldInfo field = type.GetField("age", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(obj, 25);</p>

反射虽然灵活,但性能低于直接调用,建议缓存 Type 和 MethodInfo 对象,或结合委托(如 Expression Tree 或 Delegate.CreateDelegate)提升效率。

基本上就这些,掌握 Type、Activator、GetMethod、Invoke 等核心操作,就能实现大多数动态需求。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c# gate gate.

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6539

3

JavaScript中的typeof用法
JavaScript中的typeof用法

在JavaScript中,typeof是一个用来确定给定变量的数据类型的操作符。可以用来确定一个变量是字符串、数字、布尔值、函数、对象或undefined的数据类型。更多关于typeof用法相关文章,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

2023.11.23

8347

13

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

20

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

20

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

20

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 12.3万人学习

JavaScript基础精讲视频教程
JavaScript基础精讲视频教程

共36课时 | 9.5万人学习

Python进阶视频教程
Python进阶视频教程

共30课时 | 9.1万人学习