跳到主要内容

LuaAlias

为 C# 方法重载提供 Lua 侧额外键名,O(1) 绑定到单一重载,绕过运行时分派(dispatch)。

using ZLua;

public class Demo
{
[LuaAlias("run_i32")]
public void Run(int value) { x = value; }

public void Run(string value) { x = value?.Length ?? 0; }
}
local demo = CSharp.AC.Demo()
demo:run_i32(10) -- 直接命中 Run(int)
demo:Run("hi") -- 仍走 Run 的 dispatch

属性定义

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
public sealed class LuaAliasAttribute : Attribute
{
public string Alias { get; }
public LuaAliasAttribute(string alias);
}
说明
目标Method
多重每个方法最多一个别名
继承继承到子类重写

键空间规则(注册期强制)

对同一类型、同一静态/实例域:

{ 默认 C# 方法名 } ∩ { 别名 } = ∅
约束说明
别名 ≠ 已有默认方法名含继承链上已注册到该元表的方法名
别名之间唯一同类型内不得重复
默认名不得占用别名例如不能同时存在 run_i32() 方法与 [LuaAlias("run_i32")]

禁止示例:

[LuaAlias("Run")] // 错误:与 dispatch 键 Run 冲突
public void Run(int value) { }

[LuaAlias("GetValue")] // 错误:与已有方法 GetValue 冲突
public void Run(int value) { }
public int GetValue() => 0;

XML 配置(不可改源码时)

<Type fullName="Demo">
<Method name="Run" signature="(System.Int32)" alias="run_i32"/>
</Type>
字段说明
fullName类型全名
nameC# 方法名
signature仅参数部分,如 (System.Int32)
aliasLua 侧键名

优先级:Attribute > XML。合并后执行与 § 键空间相同的校验。

静态 / 实例

方法种类别名写入位置Lua 调用
实例方法实例 methodTableobj:alias(...)
静态方法类型表 methodTableTypeTable.alias(...)

get_method / register_method 的关系

方式时机适用
[LuaAlias] / XML类型 EnsureBinding编译期固定、热路径首选
zlua.get_method + register_methodLua 运行时无法改 C#、或动态绑定

二者语义等价:均为 methodTable 上的 额外键,不替换默认方法名的 dispatch。

Mono / Il2Cpp 支持

运行时支持
Mono (Editor)
Il2Cpp (Player)❌(MVP 未实现)

相关文档