1.c#反射
1.介绍
反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。
2.通过反射获取类型
//1.通过typeof获取某个值的类型
System.Type stuType=typeof(Student);
//2.通过一个对象获取该对象所对应的类的类型
Student stu=new Student();
System.Type type=stu.GetType();
//3.通过类的名称字符串获取对应的类型
System.Type strType =System.Type.GetType("Student");
3.类型常用类型(获取方法)(常用方法)
1.Assembly:定义和加载程序集,加载程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例(type.Assembly)
2.Module:了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法(type.Module)
3.ConstructorInfo:了解构造器的名称、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等(type.GetConstructor/GetConstructors)
4.MethodInfo:了解方法的名称、返回类型、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等(type.GetMethod/GetMethods)(invoke调用方法)
5.FieldInfo:了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值(type.GetField/GetFields)(SetValue(对象,值)GetValue(对象)静态字段对象设置为null)
6.EventInfo:了解事件的名称、事件处理程序数据类型、自定义特性、声明类型和反射类型等,并添加或移除事件处理程序(type.GetEvent/GetEvents)
7.PropertyInfo:了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,并获取或设置属性值(type.GetProperty/GetProperties)
8.ParameterInfo:了解参数的名称、数据类型、参数是输入参数还是输出参数等,以及参数在方法签名中的位置等(type.GetMethod.GetParameters)
9.MemberInfo:了解成员的名称、返回类型、参数、访问修饰符(如public或private)和实现详细信息等(type.GetMember/GetMembers)(MemberType获取成员类型)
4.BindingFlags
按照权限来获取类型的枚举。下列常用4种类型
1.BindingFlag.Public 公有成员
2.BindingFlags.Instance 实例成员
3.BindingFlag.NonPublic 非公有成员
4.BindingFlags.Static 静态成员
5.Activator
通过反射几种不同的构造来实例化对象。
1.Activator.CreateInstance(Type t) //默认公有无参构造
2.Activator.CreateInstance(Type t ,bool nonPublic)//默认私有无参构造
3.Activator.CreateInstance(Type t,params object[] args)//默认公有有参构造
2.ILRuntime反射
C#工程中反射是一个非常经常用到功能,ILRuntime也对反射进行了支持,在热更DLL中使用反射跟原生C#没有任何区别。接下来主要介绍如何在主工程中反射热更DLL中的类型。
//热更DLL中的类型我们均需要通过AppDomain取得
IType it = appdomain.LoadedTypes["HotFix_Project.InstanceClass"];
//LoadedTypes返回的是IType类型,但是我们需要获得对应的System.Type才能继续使用反射接口
System.Type type = it.ReflectionType;
//取得Type之后就可以按照我们熟悉的方式来反射调用了
var ctor = type.GetConstructor(new System.Type[0]);
var obj = ctor.Invoke(null);
var fi = type.GetField("id", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
fi.SetValue(obj, 111111);
var pi = type.GetProperty("ID");
Debug.Log("ID = " + pi.GetValue(obj, null));
ILRuntime免费课程
两小时带你搞懂ILRuntime热更新Unity ILRuntime 热更新https://www.bycwedu.com/promotion_channels/1021737097