上一篇: C# 特性(Attribute)

下一篇: C# 属性(Property)

C# 反射(Reflection)

在本教程中,您将学习如何在 C# 中使用反射。反射是一种允许程序在运行时检查和调用类型信息的技术。通过使用反射,可以动态地创建对象、获取对象的属性和方法、调用方法等。

基本概念

以下是与反射相关的基本概念:

  • 反射 :在运行时检查和操作类型信息的能力。
  • System.Reflection 命名空间 :包含用于处理反射的类。

获取类型信息

首先,了解如何使用反射获取某个类型的信息。可以通过 Type 类来获取类型的详细信息。

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

                        Console.WriteLine("Type Name: " + type.Name);
                        Console.WriteLine("Full Name: " + type.FullName);

                        Console.ReadLine();
                    }
                }
                

在这个例子中,使用 typeof 关键字获取 Program 类的类型信息,并输出其名称和完整名称。

获取属性和方法

可以使用反射来获取类的属性和方法。

                class Program
                {
                    static void Main(string[] args)
                    {
                        Type type = typeof(DemoClass);

                        PropertyInfo[] properties = type.GetProperties();
                        MethodInfo[] methods = type.GetMethods();

                        Console.WriteLine("Properties:");
                        foreach (PropertyInfo property in properties)
                        {
                            Console.WriteLine(" - " + property.Name);
                        }

                        Console.WriteLine("Methods:");
                        foreach (MethodInfo method in methods)
                        {
                            Console.WriteLine(" - " + method.Name);
                        }

                        Console.ReadLine();
                    }
                }

                public class DemoClass
                {
                    public int Property1 { get; set; }
                    public string Property2 { get; set; }

                    public void Method1() { }
                    public double Method2(int x) { return x * 2; }
                }
                

在这个例子中,使用 GetPropertiesGetMethods 方法获取 DemoClass 类的属性和方法,并将它们输出到控制台。

创建对象实例

反射还可以用于动态地创建对象实例。下面的示例演示了如何使用反射创建 DemoClass 的实例。

                class Program
                {
                    static void Main(string[] args)
                    {
                        Type type = typeof(DemoClass);
                        object instance = Activator.CreateInstance(type);

                        Console.WriteLine("Instance of: " + instance.GetType().Name);

                        Console.ReadLine();
                    }
                }

                public class DemoClass
                {
                    // ...
                }
                

在这个例子中,使用 Activator.CreateInstance 方法根据类型信息创建了一个新的 DemoClass 实例。

获取和设置属性值

使用反射,可以动态地获取和设置对象的属性值。

                class Program
                {
                    static void Main(string[] args)
                    {
                        Type type = typeof(DemoClass);
                        object instance = Activator.CreateInstance(type);

                        PropertyInfo property = type.GetProperty("Property1");

                        // 设置属性值
                        property.SetValue(instance, 42);
                        // 获取属性值
                        int value = (int)property.GetValue(instance);

                        Console.WriteLine("Property1 value: " + value);

                        Console.ReadLine();
                    }
                }

                public class DemoClass
                {
                    public int Property1 { get; set; }
                    // ...
                }
                

在这个例子中,使用 GetProperty 方法获取 Property1 的属性信息,然后使用 SetValueGetValue 方法分别设置和获取属性值。

调用方法

反射还可以用于动态调用对象的方法。

                class Program
                {
                    static void Main(string[] args)
                    {
                        Type type = typeof(DemoClass);
                        object instance = Activator.CreateInstance(type);

                        MethodInfo method = type.GetMethod("Method2");

                        // 调用方法
                        double result = (double)method.Invoke(instance, new object[] { 5 });

                        Console.WriteLine("Result of Method2: " + result);

                        Console.ReadLine();
                    }
                }

                public class DemoClass
                {
                    // ...
                    public double Method2(int x) { return x * 3; }
                }
                

在这个例子中,使用 GetMethod 方法获取 Method2 的方法信息,然后使用 Invoke 方法调用该方法并传递参数。最后,输出调用结果。

加载程序集

反射还允许您动态加载程序集(DLLs或EXEs)并访问其中的类型和成员。

                class Program
                {
                    static void Main(string[] args)
                    {
                        // 加载程序集
                        Assembly assembly = Assembly.LoadFrom("DemoLibrary.dll");

                        // 获取 DemoClass 类型信息
                        Type type = assembly.GetType("DemoLibrary.DemoClass");

                        // 创建实例、设置属性、调用方法等
                        // ...

                        Console.ReadLine();
                    }
                }
                

在这个例子中,使用 Assembly.LoadFrom 方法加载了名为 "DemoLibrary.dll" 的程序集,并使用 GetType 方法从中获取了 DemoClass 的类型信息。此时,可以像前面的示例一样创建对象实例、设置属性值和调用方法。

注意 :确保已将 "DemoLibrary.dll" 文件放置在可访问的路径下,例如当前应用程序的执行目录。

小结

通过本教程,您已学会如何在 C# 中使用反射以及各种与反射相关的操作。通过反射,可以动态地检查和操作类型、创建对象实例、获取和设置属性值以及调用方法。请继续学习 C# 的其他功能并积累实践经验。