反射
在C#中,反射(Reflection)是一个强大的工具,它允许程序在运行时检查类型的信息(如类、结构、接口、字段、属性、方法等),并且可以动态地创建和调用类型的实例。反射主要使用System.Reflection
命名空间中的类。
以下是一些反射的常见用法:
-
获取类型信息:
- 使用
Typeof
运算符或object.GetType()
方法获取类型的Type
对象。 - 使用
Type
对象的属性(如Name
、Namespace
、BaseType
等)获取类型的基本信息。
- 使用
-
获取成员信息:
- 使用
Type
对象的GetFields
、GetProperties
、GetMethods
等方法获取类型的字段、属性和方法信息。 - 这些方法返回
FieldInfo
、PropertyInfo
和MethodInfo
的数组,这些类提供了对成员更深入的访问。
- 使用
-
动态创建和调用:
- 使用
Activator.CreateInstance
方法动态创建类型的实例。 - 使用
MethodInfo
的Invoke
方法动态调用方法。 - 使用
FieldInfo
的SetValue
和GetValue
方法设置和获取字段的值。 - 使用
PropertyInfo
的SetValue
和GetValue
方法设置和获取属性的值。
- 使用
-
自定义属性:
- 使用自定义属性(Attribute)为代码添加元数据。
- 使用反射在运行时读取这些自定义属性。
RefObject refObject = new RefObject("DWK"); refObject.Index = 1; var type = refObject.GetType(); Console.WriteLine(type.GetProperty("Index").GetValue(refObject)); Console.WriteLine(type.GetProperty("Name").GetValue(refObject)); Console.WriteLine(type.GetMethod("GetName").Invoke(refObject, null)); //创建对象 //命名空间 //type = Type.GetType("ConsoleApp1.RefObject"); //加载程序集 var assembly = Assembly.LoadFrom("ConsoleApp1.dll"); type = assembly.GetType("ConsoleApp1.RefObject"); var gzhs = type.GetConstructor(Type.EmptyTypes); var obj = gzhs.Invoke(null);//无参构造 Console.WriteLine(type.GetProperty("Index").GetValue(obj)); Console.WriteLine(type.GetProperty("Name").GetValue(obj)); Console.WriteLine(type.GetMethod("GetName").Invoke(obj, null)); var gzhs1 = type.GetConstructor(new[] { typeof(string) }); var obj1 = gzhs1.Invoke(new object[] { "CSY" });//有参构造 Console.WriteLine(type.GetProperty("Index").GetValue(obj1)); Console.WriteLine(type.GetProperty("Name").GetValue(obj1)); Console.WriteLine(type.GetMethod("GetName").Invoke(obj1, null));
喜欢 C#、SQL、Web