ILRuntime第二课预备知识-ILRuntime中的反射
来源:互联网 发布:索隆的三把刀最好淘宝 编辑:程序博客网 时间:2024/06/07 08:59
官方原文链接:https://ourpalm.github.io/ILRuntime/public/v1/guide/reflection.html
ILRuntime中的反射
用C#开发项目,很多时候会需要使用反射来实现某些功能。但是在脚本中使用反射其实是一个非常困难的事情。因为这需要把ILRuntime中的类型转换成一个真实的C#运行时类型,并把它们映射起来
默认情况下,System.Reflection命名空间中的方法,并不可能得知ILRuntime中定义的类型,因此无法通过Type.GetType等接口取得热更DLL里面的类型。而且ILRuntime里的类型也并不是一个System.Type。
为了解决这个问题,ILRuntime额外实现了几个用于反射的辅助类:ILRuntimeType
,ILRuntimeMethodInfo
,ILRuntimeFieldInfo
等,来模拟系统的类型来提供部分反射功能
通过反射获取Type
在热更DLL
当中,直接调用Type.GetType(“TypeName”)或者typeof(TypeName)均可以得到有效System.Type类型实例
//在热更DLL中,以下两种方式均可以
Type t = typeof(TypeName);
Type t2 = Type.GetType("TypeName");
在Unity主工程中
,无法通过Type.GetType来取得热更DLL内部定义的类,而只能通过以下方式得到System.Type实例:
IType type = appdomain.LoadedTypes["TypeName"];
Type t = type.ReflectedType;
通过反射创建实例
在热更DLL
当中,可以直接通过Activator来创建实例:
Type t = Type.GetType("TypeName");//或者typeof(TypeName)
//以下两种方式均可以
object instance = Activator.CreateInstance(t);
object instance = Activator.CreateInstance<TypeName>();
在Unity主工程中
,无法通过Activator来创建热更DLL内类型的实例,必须通过AppDomain来创建实例:
object instance = appdomain.Instantiate("TypeName");
通过反射调用方法
在热更DLL
当中,通过反射调用方法跟通常C#用法没有任何区别
Type type = typeof(TypeName);
object instance = Activator.CreateInstance(type);
MethodInfo mi = type.GetMethod("foo");
mi.Invoke(instance, null);
在Unity主工程中
,可以通过C#通常用法来调用,也可以通过ILRuntime自己的接口来调用,两个方式是等效的:
IType t = appdomain.LoadedTypes["TypeName"];
Type type = t.ReflectedType;
object instance = appdomain.Instantiate("TypeName");
//系统反射接口
MethodInfo mi = type.GetMethod("foo");
mi.Invoke(instance, null);
//ILRuntime的接口
IMethod m = t.GetMethod("foo", 0);
appdomain.Invoke(m, instance, null);
通过反射获取和设置Field的值
在热更DLL和Unity主工程中获取和设置Field的值跟通常C#用法没有区别
Type t;
FieldInfo fi = t.GetField("field");
object val = fi.GetValue(instance);
fi.SetValue(instance, val);
通过反射获取Attribute标注
在热更DLL和Unity主工程中获取Attribute标注跟通常C#用法没有区别
Type t;
FieldInfo fi = t.GetField("field");
object[] attributeArr = fi.GetCustomAttributes(typeof(SomeAttribute), false);
限制和注意事项
在Unity主工程中不能通过new T()的方式来创建热更工程中的类型实例
- ILRuntime第二课预备知识-ILRuntime中的反射
- ILRuntime第三课预备知识-ILRuntime中的委托
- ILRuntime第二课Invocation
- ILRuntime第一课HelloWorld
- ILRuntime第三课Delegate
- ILRuntime第四课Inheritance
- 第二章 预备知识
- Unity中SLua、Tolua、XLua和ILRuntime效率评测
- 预备知识
- 预备知识
- 预备知识
- 预备知识
- 预备知识
- 预备知识
- C#中的反射知识
- 破解教程 第三课 破解预备知识
- 破解教程 第三课 破解预备知识
- word2vec 中的数学原理详解(二)预备知识
- HTML常用的特殊符号总结 2014年9月12日 22704次浏览 html中经常会用到一些特殊符号,例如箭头,雪花,心形等等,这些符号就不用css样式或者图片来写了,直接用html特殊符号可以实现。
- Android Studio 3.+版本 Gradle中Complie和Implementation
- CodeM 数码
- 二叉树相关操作(前序遍历,中序遍历,后序遍历,层次序遍历等)递归和非递归实现
- 不带权并查集的操作
- ILRuntime第二课预备知识-ILRuntime中的反射
- Java动态代理(代理模式/委托模式)
- 在Ubuntu上用命令创建你的第一个Qt程序
- [linux] 内核同步机制 -- 原子操作
- ArrayList源码简略解读
- 安装Dubbo管理控制台
- Android开发者e周报 第1期
- 二级联动的下拉框
- 非空判断