上一篇: 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; } }
在这个例子中,使用 GetProperties
和 GetMethods
方法获取 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
的属性信息,然后使用 SetValue
和
GetValue
方法分别设置和获取属性值。
调用方法
反射还可以用于动态调用对象的方法。
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# 的其他功能并积累实践经验。