当前位置:首页 > C# > 正文

C#反射(Reflection)获取类型信息详解

在C#编程中,反射(Reflection) 是一项强大的功能,它允许程序在运行时检查和操作类型、方法、属性等元数据。通过 C#反射,我们可以在不知道具体类型的情况下,动态地创建对象、调用方法或读取属性值。这对于框架开发、插件系统、序列化/反序列化等场景非常有用。

C#反射(Reflection)获取类型信息详解 C#反射 获取类型信息 C# Reflection教程 动态类型分析 第1张

什么是反射?

简单来说,反射 就是程序在运行时“自省”的能力。比如,你有一个对象,但你不知道它属于哪个类,这时你可以使用反射来获取它的类型、字段、方法等信息。

在 .NET 中,所有类型信息都存储在 System.Type 类中。通过 Type 对象,我们可以访问类的名称、命名空间、基类、实现的接口、公共成员等。

如何获取 Type 对象?

有三种常见方式获取 Type 对象:

  1. 使用 typeof(类型名)
  2. 使用对象的 .GetType() 方法
  3. 使用 Type.GetType("完整类型名")

示例代码:

// 定义一个简单的类class Person{    public string Name { get; set; }    public int Age { get; set; }    public void SayHello()    {        Console.WriteLine($"Hello, I'm {Name}");    }}// 获取 Type 的三种方式Type type1 = typeof(Person);Person p = new Person();Type type2 = p.GetType();Type type3 = Type.GetType("YourNamespace.Person"); // 注意:需完整命名空间Console.WriteLine(type1 == type2); // 输出 True

使用反射获取类型信息

一旦有了 Type 对象,就可以调用其方法获取详细信息。以下是一些常用方法:

  • Name:获取类型的简短名称
  • FullName:获取包含命名空间的完整名称
  • GetProperties():获取所有公共属性
  • GetMethods():获取所有公共方法
  • GetFields():获取所有公共字段

完整示例:动态分析 Person 类

using System;using System.Reflection;class Program{    static void Main()    {        Type personType = typeof(Person);        Console.WriteLine($"类型名称: {personType.Name}");        Console.WriteLine($"完整名称: {personType.FullName}");        Console.WriteLine($"是否为类: {personType.IsClass}");        Console.WriteLine("\n属性列表:");        foreach (PropertyInfo prop in personType.GetProperties())        {            Console.WriteLine($"- {prop.Name} ({prop.PropertyType.Name})");        }        Console.WriteLine("\n方法列表:");        foreach (MethodInfo method in personType.GetMethods())        {            // 过滤掉继承自 Object 的方法(如 ToString, Equals 等)            if (method.DeclaringType == personType)            {                Console.WriteLine($"- {method.Name}()");            }        }    }}

运行上述代码,你将看到类似如下输出:

类型名称: Person完整名称: YourNamespace.Person是否为类: True属性列表:- Name (String)- Age (Int32)方法列表:- SayHello()

为什么学习 C# 反射很重要?

掌握 动态类型分析 能力,可以让你编写更灵活、可扩展的代码。例如:

  • ORM 框架(如 Entity Framework)使用反射将数据库字段映射到类属性
  • JSON 序列化库(如 Newtonsoft.Json)通过反射读写对象属性
  • 依赖注入容器利用反射创建服务实例

虽然反射性能略低于直接调用,但在需要灵活性的场景下,它是不可或缺的工具。

小结

本文介绍了 C#反射 的基本概念,演示了如何通过 Type 对象 获取类型信息,并展示了实际代码示例。希望这篇 C# Reflection教程 能帮助你理解如何在运行时进行 动态类型分析。随着你对 .NET 生态的深入,反射将成为你工具箱中的重要武器。

提示:在生产环境中使用反射时,建议缓存 TypeMemberInfo 对象以提升性能。