C#中的反射例子

发布于 2023-07-04  85 次阅读


通过反射,我们可以在运行时动态地获取类型的信息,包括字段、属性和方法的信息,并对它们进行操作。这使得我们可以在不事先知道类型和成员的情况下,通过反射来操作和扩展代码。

需要注意的是,反射是一种强大的工具,但由于其灵活性和开销,使用反射可能会导致性能较低。因此,在实际应用中,应谨慎使用反射,并在性能要求较高的场景中进行评估和优化。

using System;
using System.Reflection;

public class MyClass
{
    private string privateField;
    public int PublicProperty { get; set; }

    public void PublicMethod(string message)
    {
        Console.WriteLine("PublicMethod invoked with message: " + message);
    }

    private void PrivateMethod()
    {
        Console.WriteLine("PrivateMethod invoked");
    }
}

public class Program
{
    public static void Main()
    {
        // 获取类型信息
        Type type = typeof(MyClass);

        // 创建类型的实例
        object instance = Activator.CreateInstance(type);

        // 获取字段信息并设置字段值
        FieldInfo field = type.GetField("privateField", BindingFlags.NonPublic | BindingFlags.Instance);
        field.SetValue(instance, "Reflection Field Value");

        // 获取属性信息并设置属性值
        PropertyInfo property = type.GetProperty("PublicProperty");
        property.SetValue(instance, 42);

        // 获取方法信息并调用方法
        MethodInfo method = type.GetMethod("PublicMethod");
        object[] parameters = { "Hello, Reflection!" };
        method.Invoke(instance, parameters);

        // 获取私有方法信息并调用方法
        MethodInfo privateMethod = type.GetMethod("PrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance);
        privateMethod.Invoke(instance, null);
    }
}