初级执事
阅读权限 2
积分 1985
侠名
UID 43
主题
帖子
精华
好友
银子
金子
贡献
威望
推广
活跃
荣耀
注册时间 2017-11-7
最后登录 1970-1-1
在线时间 小时
个人主页
|
楼主 |
发表于 2019-2-17 20:39:03
|
显示全部楼层
本帖最后由 general_clarke 于 2019-2-17 20:48 编辑
关于反射
as3因动态类和弱类型的原因,存在反射的位置很多
例如
var a:* = new Sprite
var b:* = new Sprite
a.x = b.x-10;
此代码因为无法判断a的类型,实际需要通过反射取到a的属性x
为解决此问题,参考flash.utils.Proxy类用法,使用C#创建工具类,命名为FRef
FRef类拥有三个函数
- void setProperty(object from, string key, object value)
- object getProperty(object from, string key)
- object callProperty(object from, string key, params object[] p)
复制代码
将AS3
a.x = b.x+10;
转为C#
FRef.setProperty(a, "x", (int)FRef.getProperty(b, "x") - 10)
上述语法有一些注意事项,
首先是getProperty后一般需要类型强转。
使用上述语法获得的Function类型需要转换为参考楼上的BindingMethodClosure对象。
具体解析过程
对一个
a.b.c.d
逐个判断每一层变量类型
如a对象不是动态类型(*, Object,MovieClip等)那么使用正常的点号表达式表示a.b
如果a.b是动态类型,那么从此位置开始,后面的每个点号均转换成FRef.getProperty/setProperty形式
得到FRef.getProperty(FRef.getProperty(a.b, "c"), "d")
|
|