C# 反射(Reflection)是一个强大的机制,允许在运行时检查程序集、模块和类型的元数据,以及动态创建和操作类型的实例。通过反射,你可以在运行时获取和设置对象的属性、调用方法、创建新对象,甚至可以加载新的程序集。
反射的主要特点和用途
- 检查对象类型:能够检查任何对象的类型。
- 动态创建实例:可以动态创建类的实例。
- 获取和设置属性和字段:能够在运行时获取或修改属性和字段的值。
- 动态调用方法:可以动态调用对象的方法。
- 程序集和模块操作:可以加载和分析程序集和模块。
- 自定义特性处理:反射允许读取自定义特性。
反射的使用示例
1. 获取类型信息
using System;public class MyClass
{public int MyProperty { get; set; }public void MyMethod() { }
}public class Program
{public static void Main(){Type myType = typeof(MyClass);Console.WriteLine("Properties:");foreach (var prop in myType.GetProperties()){Console.WriteLine(prop.Name);}Console.WriteLine("Methods:");foreach (var method in myType.GetMethods()){Console.WriteLine(method.Name);}}
}
2. 动态创建实例
using System;public class MyClass
{public MyClass(){Console.WriteLine("MyClass instance created");}
}public class Program
{public static void Main(){Type myType = typeof(MyClass);MyClass myClassInstance = (MyClass)Activator.CreateInstance(myType);}
}
3. 获取和设置属性值
using System;
using System.Reflection;public class MyClass
{public string Name { get; set; }
}public class Program
{public static void Main(){MyClass myClass = new MyClass();PropertyInfo propInfo = myClass.GetType().GetProperty("Name");// 设置属性值propInfo.SetValue(myClass, "Test Name");// 获取属性值string value = (string)propInfo.GetValue(myClass);Console.WriteLine("Name: " + value);}
}
4. 动态调用方法
using System;
using System.Reflection;public class MyClass
{public void MyMethod(string message){Console.WriteLine("Message: " + message);}
}public class Program
{public static void Main(){MyClass myClass = new MyClass();MethodInfo methodInfo = myClass.GetType().GetMethod("MyMethod");// 动态调用方法methodInfo.Invoke(myClass, new object[] { "Hello Reflection" });}
}
这些示例展示了反射的基本使用方法,包括获取类型信息、创建类实例、操作属性和字段,以及动态调用方法。反射是一个功能强大但相对高开销的特性,因此在性能敏感的应用中应谨慎使用。