C# 编程指南:反射

反射是C#中一种强大的机制,它允许我们在运行时动态地获取、操作和调用类型的成员(属性、方法、字段等)以及创建对象实例。通过反射,我们可以透过类型的元数据来检索和使用代码元素,而无需在编译时了解其具体细节。

部分
1
获取类型的 Type 对象
使用 typeof 运算符来获取已知类型的 Type 对象。
使用 Type.GetType(string typeName) 方法来根据类型的名称获取 Type 对象。
使用 obj.GetType() 方法来获取对象实例的 Type 对象。
using System;

public class MyClass
{
    public string Name { get; set; }

    public void MyMethod()
    {
        Console.WriteLine("Hello, World!");
    }
}

public class Program
{
    static void Main(string[] args)
    {
        // 使用 typeof 获取 Type 对象
        Type myClassType = typeof(MyClass);
        Console.WriteLine("Type Name: " + myClassType.Name);

        // 使用 Type.GetType 获取 Type 对象
        Type anotherType = Type.GetType("Namespace.MyClass");
        Console.WriteLine("Type Name: " + anotherType.Name);

        // 使用对象实例的 GetType 获取 Type 对象
        MyClass myObject = new MyClass();
        Type objectType = myObject.GetType();
        Console.WriteLine("Type Name: " + objectType.Name);
    }
}

在上述示例中,我们使用了三种方式获取 MyClass 类型的 Type 对象:使用 typeof 运算符、使用 Type.GetType 方法以及使用对象实例的 GetType 方法。

部分
2
获取和操作类型成员
使用 Type.GetMembers() 方法获取类型的所有成员。
使用 Type.GetMethods() 方法获取类型的所有方法。
使用 Type.GetProperties() 方法获取类型的所有属性。
使用 Type.GetFields() 方法获取类型的所有字段。
using System;
using System.Reflection;

public class MyClass
{
    public string Name { get; set; }

    public void MyMethod()
    {
        Console.WriteLine("Hello, World!");
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Type myClassType = typeof(MyClass);

        // 获取类型的所有成员
        MemberInfo[] members = myClassType.GetMembers();
        foreach (var member in members)
        {
            Console.WriteLine("Member Name: " + member.Name);
        }

        // 获取类型的所有方法
        MethodInfo[] methods = myClassType.GetMethods();
        foreach (var method in methods)
        {
            Console.WriteLine("Method Name: " + method.Name);
        }

        // 获取类型的所有属性
        PropertyInfo[] properties = myClassType.GetProperties();
        foreach (var property in properties)
        {
            Console.WriteLine("Property Name: " + property.Name);
        }

        // 获取类型的所有字段
        FieldInfo[] fields = myClassType.GetFields();
        foreach (var field in fields)
        {
            Console.WriteLine("Field Name: " + field.Name);
        }
    }
}

在上述示例中,我们使用 Type.GetMembers、Type.GetMethods、Type.GetProperties 和 Type.GetFields 方法来获取 MyClass 类型的成员、方法、属性和字段。然后,我们使用循环遍历并打印每个成员的名称。

部分
3
创建对象实例和调用方法
使用 Activator.CreateInstance(Type type) 方法创建类型的对象实例。
使用 MethodInfo.Invoke(object obj, object[] parameters) 方法调用方法。
using System;
using System.Reflection;

public class MyClass
{
    public string Name { get; set; }

    public void MyMethod()
    {
        Console.WriteLine("Hello, World!");
    }
}

public class Program
{
    static void Main(string[] args)
    {
        Type myClassType = typeof(MyClass);

        // 创建对象实例
        object myObject = Activator.CreateInstance(myClassType);

        // 调用方法
        MethodInfo methodInfo = myClassType.GetMethod("MyMethod");
        methodInfo.Invoke(myObject, null);
    }
}

在上述示例中,我们使用 Activator.CreateInstance 方法创建了 MyClass 类型的对象实例。然后,使用 MethodInfo.Invoke 方法调用了 MyMethod 方法。 通过以上示例,我们可以看到反射提供了一种强大的机制,使我们能够在运行时动态地获取、操作和调用类型的成员。这对于编写通用代码、插件系统和动态加载程序集等场景非常有用。需要注意的是,反射操作可能会带来一定的性能开销,因此应该在必要时使用,并且要注意处理异常情况。

    目录

  • 1.
    获取类型的 Type 对象
  • 2.
    获取和操作类型成员
  • 3.
    创建对象实例和调用方法