C#中的反射是什么 C# Reflection动态获取类型信息的方法

小老鼠
发布: 2025-11-25 12:27:32
原创
815人浏览过
C#反射是通过System.Reflection实现的运行时类型操作机制,可动态获取类型信息、创建实例、调用方法和访问成员。利用typeof、GetType或Type.GetType可获取Type对象,进而查询类的结构;通过Activator.CreateInstance创建对象,GetMethod和Invoke调用方法,GetProperty和GetValue读取属性值。常用于序列化、ORM、依赖注入、插件系统和单元测试等场景,如加载外部DLL并执行IPlugin接口实现类。虽提升灵活性与扩展性,但性能较低,需避免在关键路径滥用。

c#中的反射是什么 c# reflection动态获取类型信息的方法

C#中的反射(Reflection) 是一种强大的语言特性,允许程序在运行时动态地获取类型信息、创建对象实例、调用方法、访问字段和属性等。通过反射,你可以在不知道具体类型的情况下操作类和成员,这在开发框架、序列化、插件系统等场景中非常有用。

什么是C#反射?

反射是 .NET 提供的一种机制,通过 System.Reflection 命名空间中的类来实现。它能让程序“检查自己”,比如查看某个类型的名称、方法、参数、属性、字段、特性等元数据。

例如:你可以通过字符串名称加载一个类型,并调用它的方法,而不需要在编译时引用该类型。

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

最常用的方式是使用 typeofGetType()Type.GetType() 获取 Type 对象,然后查询其结构。

  • typeof(ClassName):用于已知类型,在编译时获取 Type
  • object.GetType():从实例获取其实际类型
  • Type.GetType("全限定名"):通过字符串动态加载类型,支持跨程序集

示例:

Type type = typeof(string);
Console.WriteLine(type.Name); // 输出: String
<p>string str = "hello";
Type type2 = str.GetType();
Console.WriteLine(type2.FullName); // System.String</p><p>Type type3 = Type.GetType("System.Collections.ArrayList");
if (type3 != null)
{
Console.WriteLine("找到类型:" + type3.Name);
}
登录后复制

利用反射创建实例并调用成员

获取 Type 后,可以动态创建对象并操作其成员。

听脑AI
听脑AI

听脑AI语音,一款专注于音视频内容的工作学习助手,为用户提供便捷的音视频内容记录、整理与分析功能。

听脑AI 745
查看详情 听脑AI
  • Activator.CreateInstance(type):创建类型的实例
  • type.GetMethod("MethodName"):获取方法信息
  • methodInfo.Invoke(obj, parameters):调用方法
  • type.GetProperty("Name")property.GetValue(obj):读取属性值

示例:动态调用一个类的方法

// 假设有一个类
public class Calculator
{
    public int Add(int a, int b) => a + b;
}
<p>// 反射调用
Type calcType = typeof(Calculator);
var instance = Activator.CreateInstance(calcType);</p><p>MethodInfo method = calcType.GetMethod("Add");
var result = method.Invoke(instance, new object[] { 5, 3 });</p><p>Console.WriteLine(result); // 输出: 8
登录后复制

反射的典型应用场景

虽然反射性能低于直接调用,但在某些高级场景中不可或缺。

  • 序列化/反序列化:如 JSON 或 XML 序列化工具需要遍历对象的属性
  • ORM 框架:将数据库记录映射到实体类,依赖反射读写属性
  • 依赖注入容器:自动解析构造函数参数并创建服务实例
  • 插件系统:从外部 DLL 加载程序集并执行其中的类型
  • 单元测试框架:查找带有特定特性的测试方法并执行

示例:加载外部程序集

Assembly assembly = Assembly.LoadFrom("MyPlugin.dll");
Type[] types = assembly.GetTypes();
<p>foreach (Type t in types)
{
if (t.IsClass && typeof(IPlugin).IsAssignableFrom(t))
{
var plugin = Activator.CreateInstance(t);
// 调用插件逻辑
}
}
登录后复制

基本上就这些。反射让 C# 具备了高度的灵活性和扩展能力,但也要注意避免滥用,尤其是在性能敏感的路径中。合理使用,能极大提升代码的通用性和可维护性。

以上就是C#中的反射是什么 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号