Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
东方怂天
xLua
提交
76347b99
X
xLua
项目概览
东方怂天
/
xLua
通知
4
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
X
xLua
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
76347b99
编写于
9月 22, 2017
作者:
J
johnche(车雄生)
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
添加xlua.tofunction解决重载含糊问题。
上级
ad01546f
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
66 addition
and
0 deletion
+66
-0
Assets/XLua/Doc/faq.md
Assets/XLua/Doc/faq.md
+41
-0
Assets/XLua/Src/ObjectTranslator.cs
Assets/XLua/Src/ObjectTranslator.cs
+3
-0
Assets/XLua/Src/StaticLuaCallbacks.cs
Assets/XLua/Src/StaticLuaCallbacks.cs
+22
-0
未找到文件。
Assets/XLua/Doc/faq.md
浏览文件 @
76347b99
...
...
@@ -280,3 +280,44 @@ assert(coroutine.resume(co, ...))
2、上层catch后,不打印
比如某些sdk,在回调业务时,try-catch后把异常吃了。
## 重载含糊如何处理
比如由于忽略out参数导致的Physics.Raycast其中一个重载调用不了,比如short,int无法区分的问题。
首先out参数导致重载含糊比较少见,目前只反馈(截至2017-9-22)过Physics.Raycast一个,建议通过自行封装来解决,静态函数的直接封装个另外名字的,如果是成员方法则通过Extension method来封装。
如果是hotfix场景,我们之前并没有提前封装,又希望调用指定重载怎么办?
可以通过xlua.tofunction结合反射来处理,xlua.tofunction输入一个MethodBase对象,返回一个lua函数。比如下面的C#代码:
~~~
csharp
class
TestOverload
{
public
int
Add
(
int
a
,
int
b
)
{
Debug
.
Log
(
"int version"
);
return
a
+
b
;
}
public
short
Add
(
short
a
,
short
b
)
{
Debug
.
Log
(
"short version"
);
return
(
short
)(
a
+
b
);
}
}
~~~
我们可以这么调用指定重载:
~~~
lua
local
m1
=
typeof
(
CS
.
TestOverload
):
GetMethod
(
'Add'
,
{
typeof
(
CS
.
System
.
Int16
),
typeof
(
CS
.
System
.
Int16
)})
local
m2
=
typeof
(
CS
.
TestOverload
):
GetMethod
(
'Add'
,
{
typeof
(
CS
.
System
.
Int32
),
typeof
(
CS
.
System
.
Int32
)})
local
f1
=
xlua
.
tofunction
(
m1
)
--切记对于同一个MethodBase,只tofunction一次,然后重复使用
local
f2
=
xlua
.
tofunction
(
m2
)
local
obj
=
CS
.
TestOverload
()
f1
(
obj
,
1
,
2
)
--调用short版本,成员方法,所以要传对象,静态方法则不需要
f2
(
obj
,
1
,
2
)
--调用int版本
~~~
Assets/XLua/Src/ObjectTranslator.cs
浏览文件 @
76347b99
...
...
@@ -562,6 +562,9 @@ namespace XLua
LuaAPI
.
xlua_pushasciistring
(
L
,
"metatable_operation"
);
LuaAPI
.
lua_pushstdcallcfunction
(
L
,
StaticLuaCallbacks
.
XLuaMetatableOperation
);
LuaAPI
.
lua_rawset
(
L
,
-
3
);
LuaAPI
.
xlua_pushasciistring
(
L
,
"tofunction"
);
LuaAPI
.
lua_pushstdcallcfunction
(
L
,
StaticLuaCallbacks
.
ToFunction
);
LuaAPI
.
lua_rawset
(
L
,
-
3
);
LuaAPI
.
lua_pop
(
L
,
1
);
LuaAPI
.
lua_createtable
(
L
,
1
,
4
);
// 4 for __gc, __tostring, __index, __newindex
...
...
Assets/XLua/Src/StaticLuaCallbacks.cs
浏览文件 @
76347b99
...
...
@@ -1057,5 +1057,27 @@ namespace XLua
return
LuaAPI
.
luaL_error
(
L
,
"c# exception in delegate constructor: "
+
e
);
}
}
[
MonoPInvokeCallback
(
typeof
(
LuaCSFunction
))]
public
static
int
ToFunction
(
RealStatePtr
L
)
{
try
{
ObjectTranslator
translator
=
ObjectTranslatorPool
.
Instance
.
Find
(
L
);
MethodBase
m
;
translator
.
Get
(
L
,
1
,
out
m
);
if
(
m
==
null
)
{
return
LuaAPI
.
luaL_error
(
L
,
"ToFunction: #1 argument must be a MethodBase"
);
}
translator
.
PushFixCSFunction
(
L
,
new
LuaCSFunction
(
translator
.
methodWrapsCache
.
_GenMethodWrap
(
m
.
DeclaringType
,
m
.
Name
,
new
MethodBase
[]
{
m
}).
Call
));
return
1
;
}
catch
(
Exception
e
)
{
return
LuaAPI
.
luaL_error
(
L
,
"c# exception in ToFunction: "
+
e
);
}
}
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录