.NET中的反射(Reflection)是什么?如何动态地加载程序集和调用方法?

反射可在运行时获取类型信息并动态操作对象。通过typeof或GetType()获取Type对象,用Assembly.LoadFrom加载程序集,Activator.CreateInstance创建实例,再通过GetMethod和Invoke调用方法。常用于插件系统、ORM、序列化等场景,但性能较低,需谨慎使用。

.net中的反射(reflection)是什么?如何动态地加载程序集和调用方法?

.NET中的反射(Reflection) 是一种在运行时检查和操作程序集、类型、方法、属性等元数据的机制。通过反射,你可以在不知道具体类型的情况下,动态创建对象、调用方法、获取属性值,甚至分析类的结构。它让程序具备“自省”能力,是实现插件架构、序列化、依赖注入等高级功能的基础。

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

每个类型在运行时都有一个对应的 Type 对象,可以通过它访问成员信息:

使用 typeof(ClassName) 获取已知类型的 Type 对象 对实例调用 obj.GetType() 通过反射加载程序集后获取其中的类型// 示例:获取类型并列出公共方法

Type type = typeof(string);MethodInfo[] methods = type.GetMethods();foreach (var method in methods){    Console.WriteLine(method.Name);}

动态加载程序集

你可以不在编译时引用程序集,而在运行时动态加载DLL文件:

Assembly.LoadFrom(“路径”):从指定路径加载程序集 Assembly.LoadFile(“路径”):更底层的方式加载文件 Assembly.Load(byte[]):从字节数组加载(如网络下载)// 示例:从文件加载程序集

try{    Assembly assembly = Assembly.LoadFrom("MyPlugin.dll");    Type[] types = assembly.GetTypes();    foreach (Type t in types)    {        Console.WriteLine(t.Name);    }}catch (FileNotFoundException ex){    Console.WriteLine("找不到程序集:" + ex.Message);}

动态创建实例并调用方法

有了 Type 对象后,可以创建实例并调用其方法:

使用 Activator.CreateInstance(type) 创建对象 用 type.GetMethod(“MethodName”) 获取 MethodInfo 调用 method.Invoke(obj, 参数数组)// 示例:调用某个类的 SayHello 方法

Assembly assembly = Assembly.LoadFrom("MyLibrary.dll");Type myType = assembly.GetType("MyLibrary.MyClass");object instance = Activator.CreateInstance(myType);MethodInfo method = myType.GetMethod("SayHello");string result = (string)method.Invoke(instance, null);Console.WriteLine(result);

如果方法有参数,传入 object 数组即可:

method.Invoke(instance, new object[] { "张三" });

实际应用场景

反射常用于以下场景:

插件系统:主程序加载外部 DLL 并调用约定接口 ORM 框架:根据实体类自动映射数据库字段 序列化/反序列化:遍历对象属性生成 JSON 或 XML 单元测试框架:发现并执行标记了 [TestMethod] 的方法

注意:反射性能低于直接调用,频繁使用可结合 DelegateExpression 缓存调用逻辑。

基本上就这些。

以上就是.NET中的反射(Reflection)是什么?如何动态地加载程序集和调用方法?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1442478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 19:05:52
下一篇 2025年12月14日 18:37:34

相关推荐

发表回复

登录后才能评论
关注微信