0

0

C#中的反射(Reflection)是什么?动态编程与C#反射机制实战详解

煙雲

煙雲

发布时间:2025-11-26 12:37:02

|

991人浏览过

|

来源于php中文网

原创

C#中的反射是通过System.Reflection命名空间实现的运行时类型操作机制,允许动态获取类型信息、创建对象、调用方法和访问字段属性。利用Type类可查询类型元数据,Activator.CreateInstance能实例化对象,GetMethod、GetProperty等方法结合BindingFlags可访问公共或私有成员,Invoke用于执行方法。反射还支持加载外部程序集并查找实现特定接口的类型,常用于插件系统、ORM、序列化等场景。但因性能开销较大,建议缓存反射结果或使用Delegate.CreateDelegate生成委托以提升效率。

c#中的反射(reflection)是什么?动态编程与c#反射机制实战详解

反射(Reflection)是C#中一种强大的机制,它允许程序在运行时动态获取类型信息、创建对象、调用方法、访问字段和属性。换句话说,通过反射,你可以在不知道具体类型的情况下操作类和对象,这为动态编程提供了极大的灵活性。

什么是C#中的反射?

在编译时,我们通常知道要使用的类型、方法和属性。但在某些场景下,比如插件系统、序列化、ORM框架或依赖注入容器中,类型可能直到运行时才能确定。这时就需要使用反射。

反射的核心是System.Reflection命名空间,它提供了一系列类(如TypeMethodInfoFieldInfo等),用于查询和操作程序集中的元数据。

常见用途包括:
  • 加载程序集并查看其中的类型
  • 动态创建对象实例
  • 调用对象的方法(包括私有方法)
  • 读取或设置字段与属性值
  • 实现通用的序列化/反序列化逻辑

如何使用Type获取类型信息?

Type类是反射的入口点。你可以通过typeof()或对象的GetType()方法获取一个类型的Type实例。

// 获取类型信息
Type type = typeof(string);
Console.WriteLine(type.Name);        // 输出: String
Console.WriteLine(type.Namespace);   // 输出: System

// 或从实例获取
var list = new List();
Type listType = list.GetType();
Console.WriteLine(listType.FullName); // System.Collections.Generic.List`1[System.Int32]

通过Type可以获取构造函数、方法、属性、字段等成员信息。

动态创建对象与调用方法

反射允许你在运行时根据类型名创建实例,并调用其方法,即使这些类型在编码时未知。

晓象AI资讯阅读神器
晓象AI资讯阅读神器

晓象-AI时代的资讯阅读神器

下载
// 假设有一个简单类
public class Calculator
{
    public int Add(int a, int b) => a + b;
    private string GetSecret() => "秘密信息";
}

// 使用反射创建实例并调用公共方法
Type calcType = typeof(Calculator);
object calc = Activator.CreateInstance(calcType);

MethodInfo addMethod = calcType.GetMethod("Add");
int result = (int)addMethod.Invoke(calc, new object[] { 5, 3 });
Console.WriteLine(result); // 输出: 8

如果你想调用私有方法,需要指定绑定标志:

MethodInfo secretMethod = calcType.GetMethod("GetSecret", 
    BindingFlags.NonPublic | BindingFlags.Instance);
string secret = (string)secretMethod.Invoke(calc, null);
Console.WriteLine(secret); // 输出: 秘密信息

访问属性和字段

除了方法,反射也能读写属性和字段,无论其访问级别。

public class Person
{
    public string Name { get; set; }
    private int age;
}

Person p = new Person();
Type personType = p.GetType();

// 设置公共属性
PropertyInfo nameProp = personType.GetProperty("Name");
nameProp.SetValue(p, "Alice");

// 访问私有字段
FieldInfo ageField = personType.GetField("age", 
    BindingFlags.NonPublic | BindingFlags.Instance);
ageField.SetValue(p, 25);

Console.WriteLine(nameProp.GetValue(p)); // Alice
Console.WriteLine(ageField.GetValue(p)); // 25

加载外部程序集进行反射

反射还能加载外部DLL文件,在运行时分析或执行其中的类型。

// 加载外部程序集(假设存在 MyPlugin.dll)
Assembly assembly = Assembly.LoadFrom("MyPlugin.dll");

// 获取所有类型
Type[] types = assembly.GetTypes();

foreach (Type t in types)
{
    Console.WriteLine($"找到类型: {t.Name}");

    // 查找实现了特定接口的类
    if (typeof(IPlugin).IsAssignableFrom(t) && !t.IsInterface)
    {
        object plugin = Activator.CreateInstance(t);
        MethodInfo execute = t.GetMethod("Execute");
        execute.Invoke(plugin, null);
    }
}

这种机制广泛应用于插件架构或模块化系统中。

性能与使用建议

虽然反射功能强大,但它的性能比直接调用要慢,因为涉及大量的运行时查找和安全检查。

优化建议:
  • 缓存TypeMethodInfo等反射对象,避免重复查询
  • 在性能敏感场景中,考虑使用Expression TreeDelegate.CreateDelegate生成可复用的委托
  • 尽量避免频繁反射调用私有成员,这会破坏封装性且不利于维护
// 使用委托提升性能示例
MethodInfo method = typeof(Calculator).GetMethod("Add");
var addDelegate = (Func)Delegate
    .CreateDelegate(typeof(Func), null, method);

Calculator calc = new Calculator();
int result = addDelegate(calc, 10, 20); // 比Invoke快得多
基本上就这些。C#反射机制让你能在运行时“看透”类型结构并动态交互,是构建灵活、扩展性强的应用程序的重要工具。虽然要注意性能和安全性,但在合适场景下,它几乎是不可替代的。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

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

下载

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

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1024

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

450

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

5

2026.01.19

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

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

750

2023.11.23

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

79

2026.01.18

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

109

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

153

2026.01.16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 5.6万人学习

Rust 教程
Rust 教程

共28课时 | 4.6万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号