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

小老鼠
发布: 2025-11-22 18:17:46
原创
899人浏览过
通过反射可动态获取类型信息、创建对象并调用成员。使用 typeof 或 GetType() 获取 Type 对象,查询名称、命名空间等元数据;通过 Activator.CreateInstance 创建实例,支持无参或有参构造函数;利用 GetMethod 获取 MethodInfo 后调用方法,配合 BindingFlags 可访问私有成员;PropertyInfo 和 FieldInfo 分别用于读写属性与字段值;反射性能较低,建议缓存 Type 和 MethodInfo 或结合委托优化。

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

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

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

你可以通过 typeofGetType()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);
登录后复制

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

Type type = typeof(Student);
var student = Activator.CreateInstance(type, "张三", 20);
登录后复制

如何动态调用方法?

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

ClipDrop
ClipDrop

Stability.AI出品的图片处理系列工具(背景移除、图片放大、打光)

ClipDrop 112
查看详情 ClipDrop
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 等核心操作,就能实现大多数动态需求。

以上就是C#的反射(Reflection)是什么?如何动态获取类型信息并调用方法?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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