反射的定义
反射与特性Attribute息息相关
- 定义:提供封装程序集、模块和类型的对象
- 封装了程序的对象
- 封装了模块的对象
- 封装了类型的对象
- 可以通过放射Type获取该类所在的程序集、模块、以及本身的类型
核心相关API
- 获取程序集API
- 获取类型API
- 实例化获取到的类型API
Type type = typeof(类的名字)
Type type = 实例对象.GetType()
Type type = tt.GetType();
Console.WriteLine($"Assembly: {type.Assembly}" );
Console.WriteLine($"Module: {type.Module}");
Console.WriteLine($"Name: {type.Name}");
Console.WriteLine($"FullName: {type.FullName}");
Console.WriteLine($"IsClass: {type.IsClass}");
Console.WriteLine($"IsNotPublic: {type.IsNotPublic}");
Console.WriteLine($"Namespace: {type.Namespace}");
Console.WriteLine($"IsAbstract: {type.IsAbstract}");
Console.WriteLine($"IsValueType: {type.IsValueType}");
Assembly: 010对象练习1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Module: 010对象练习1.exe
Name: Ticket
FullName: _010对象练习1.Ticket
IsClass: True
IsNotPublic: True
Namespace: _010对象练习1
IsAbstract: False
IsValueType: False
type对象
- 类信息查询API:获取类各种名字
- 检测API:判断type的某些属性(是否抽象等等)
- IsClass 是否是类
- IsAbstract 是否是抽象的
- IsValueType 是否是值类型
- IsEnum 是否是枚举
- 类接口查询:获取父类类型、获取方法、获取构造、获取成员变量等等
- BaseType 获取父类的类型
- GetMembers(BindingFlags) 获取所有方法
- GetFields 获取所有字段(默认public成员变量)
- GetProperties 获取所有属性器
- GetMethods(BindingFlags) BindingFlags可以筛选查询结果 获取所有成员变量
- BindingFlags.NonPublic
- BindingFlags.Public
- BindingFlags.DeclaredOnly 不包括父类的方法
- BindingFlags.Instance 实例成员,即非静态方法
Methodinfo对象
作用:
- 方法信息查询API
- MethodInfo.Name
- 方法检测API
- methodInfo.IsGenericMethod 是否是泛型方法
- methodInfo.IsAbstract 是否是抽象方法
- methodInfo.IsConstructor 是否是构造方法
- methodInfo.IsVirtual 是否是虚方法
- methodInfo.IsPublic 是否是公开的方法
- methodInfo.IsStatic 是否是静态方法
- 方法结构查询API
- methodInfo.GetBaseDefinition
- methodInfo.ReturnType
- methodInfo.GetParamters().Length
- 调用方法API
- Invoke(调用对象, 参数)
- Invoke(调用对象, new object[]{})
FieldInfo对象
- 信息查询
- 检查API
- IsInitOnly 是否是readonly
- IsPublic
- 结构查询API
- FiledType
- SetValue(对象,值)
- GetValue(对象,值)
MemberInfo对象
- 信息查询
- 需要转换类型
PropertyInfo对象
- 信息查询
- 检查API
- CanRead 是否有get
- CanWrite 是否有set
- 结构查询API
- PropertyType 获取Property类型
- SetValue(对象, 值)
- GetValue(对象)
与Attribute配合使用
- Assembly相关API
Assembly.LoadFile(fullPath) 加载dll
assembly.GetType(TypeName) 获取类型
Activator.CreateInstance(type) 创建实例
assembly.CreateInstance(typeName) 根据反射名字创建实例
总结
- Tyep获取方式
- typeof(ClassName)
- object.GetType()
- Type.GetType(name) name = "命名空间+类名"OFramework+SomeClass“”
- Type对象的API
- 类信息查询API
- 检测API
- 类结构查询API
- BindingFlags