C# 反射

C#反射

C# 反射(Reflection)是.NET框架提供的一个强大功能,它允许程序在运行时检查和操作类型的信息。通过反射,你可以获取有关已加载的类、方法、属性等的信息,并且可以动态地创建对象和调用方法。反射对于开发诸如IDE、调试器、单元测试框架等工具非常有用。

元数据和反射

大多数程序都要处理数据,包括读、写、操作和显示数据。(图形也是数据的一种形式。) 然而,对于某些程序来说,它们操作的数据不是数字、文本或图形,而是关于程序和程序类型的信息。

1.有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中。
2.程序在运行时,可以查看其他程序集或其本身的元数据。运行中的程序查看本身的元数据或其他程序的元数据的行为叫作反射(reflection)。

使用反射的基本场景和代码示例:

反射一般来讲多用于类型相关操作。

1. 获取类型信息

假设你有一个名为 Person 的类,你可以使用反射来获取这个类的信息:

using System;
using System.Reflection;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public void SayHello()
    {
        Console.WriteLine("Hello, my name is " + Name);
    }
}

class Program
{
    static void Main()
    {
        Type personType = typeof(Person);
        Console.WriteLine("Class Name: " + personType.Name);
        
        // 获取所有公共属性
        PropertyInfo[] properties = personType.GetProperties();
        foreach (PropertyInfo property in properties)
        {
            Console.WriteLine("Property: " + property.Name);
        }
        
        // 获取所有公共方法
        MethodInfo[] methods = personType.GetMethods(BindingFlags.Public | BindingFlags.Instance);
        foreach (MethodInfo method in methods)
        {
            Console.WriteLine("Method: " + method.Name);
        }
    }
}

2. 动态创建对象

你可以使用 Activator.CreateInstance 方法来动态创建对象:

object personInstance = Activator.CreateInstance(personType);
Console.WriteLine("Created instance of type: " + personInstance.GetType().Name);

3. 调用方法

一旦你有了对象实例,你可以使用反射来调用其方法:

// 获取 SayHello 方法
MethodInfo sayHelloMethod = personType.GetMethod("SayHello");

// 设置 Name 属性
personType.GetProperty("Name").SetValue(personInstance, "John Doe", null);

// 调用 SayHello 方法
sayHelloMethod.Invoke(personInstance, null);

4. 访问私有成员

反射还可以用来访问类的私有成员,虽然这通常不推荐,因为它破坏了封装性:

FieldInfo privateField = personType.GetField("privateFieldName", BindingFlags.NonPublic | BindingFlags.Instance);
if (privateField != null)
{
    object fieldValue = privateField.GetValue(personInstance);
    Console.WriteLine("Private field value: " + fieldValue);
}

注意事项

  • 使用反射可能会影响性能,因为反射操作通常比直接的类型操作慢。
  • 反射打破了编译时的类型安全检查,因此可能导致运行时错误。
  • 在某些情况下,过度使用反射可能会导致代码难以理解和维护。

其他参考

1.C# 进阶 -反射(Reflection)
2.C#进阶-反射的详解与应用
2.C# 反射(Reflection)超详细解析
4.学懂C#编程:常用高级技术——C# 反射(Reflection):深入解析与高级应用

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值