35、C# 中的反射(Reflection)

反射是 C# 和 .NET 框架中的一个重要特性,它允许程序在运行时检查、访问和操作类型、对象、属性和方法等元数据信息。

反射的核心概念

  • 运行时类型检查:反射允许你在程序运行时获取类型的详细信息,而不需要在编译时知道这些信息。
  • 动态操作:可以动态创建类型实例、调用方法和访问属性。

反射的主要用途

  • 动态加载和检查程序集
  • 查看类型信息(类、接口、结构等)
  • 获取和设置属性值
  • 调用方法(包括私有方法)
  • 创建类型实例
  • 实现依赖注入框架
  • 序列化和反序列化对象
  • 插件系统实现

基本反射示例

csharp 复制代码
using System;
using System.Reflection;

public class Person
{
    private string name;
    
    public Person(string name)
    {
        this.name = name;
    }
    
    private void SayHello()
    {
        Console.WriteLine($"Hello, {name}");
    }
}

class Program
{
    static void Main()
    {
        // 获取类型信息
        Type personType = typeof(Person);
        Console.WriteLine($"类型名称: {personType.Name}");
        
        // 获取构造函数信息
        ConstructorInfo constructor = personType.GetConstructor(new[] { typeof(string) });
        
        // 创建实例
        object personInstance = constructor.Invoke(new object[] { "张三" });
        
        // 获取方法信息
        MethodInfo sayHelloMethod = personType.GetMethod("SayHello", BindingFlags.NonPublic | BindingFlags.Instance);
        
        // 调用私有方法
        sayHelloMethod.Invoke(personInstance, null);
    }
}

反射的优缺点

优点:

  • 灵活性高,适合通用框架和库的开发
  • 支持动态编程和元编程
  • 可以处理编译时未知的类型

缺点:

  • 性能开销较大(比直接调用慢)
  • 代码可读性降低
  • 安全性考虑(需要适当的权限)
  • 编译时类型检查失效

实际应用场景

1、ASP.NET Core MVC:模型绑定和路由系统

2、依赖注入容器:如 Autofac、Ninject

3、序列化库:如 Newtonsoft.Json

4、ORM 框架:如 Entity Framework Core

5、单元测试框架:如 xUnit、NUnit

反射是 .NET 中非常强大的功能,但应谨慎使用,通常只在确实需要动态行为时才使用它。

相关推荐
墨雪不会编程12 小时前
C++之【深入理解Vector】三部曲最终章
开发语言·c++
浅念-12 小时前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
小宋102112 小时前
Java 项目结构 vs Python 项目结构:如何快速搭一个可跑项目
java·开发语言·python
一晌小贪欢13 小时前
Python 爬虫进阶:如何利用反射机制破解常见反爬策略
开发语言·爬虫·python·python爬虫·数据爬虫·爬虫python
阿猿收手吧!13 小时前
【C++】异步编程:std::async终极指南
开发语言·c++
永远是我的最爱13 小时前
基于.NET的小小便利店前台收银系统
前端·sqlserver·.net·visual studio
小程故事多_8013 小时前
Agent Infra核心技术解析:Sandbox sandbox技术原理、选型逻辑与主流方案全景
java·开发语言·人工智能·aigc
沐知全栈开发13 小时前
SQL 日期处理指南
开发语言
黎雁·泠崖13 小时前
【魔法森林冒险】3/14 Allen类(一):主角核心属性与初始化
java·开发语言
黎雁·泠崖13 小时前
【魔法森林冒险】1/14 项目总览:用Java打造你的第一个回合制冒险游戏
java·开发语言