XLUA 实例化C#的Dictionary,List

本文详细介绍了如何在Lua中实例化C#中的自定义类作为Dictionary的值类型,解决了使用旧版xlua时,因未使用Assembly-CSharp程序集关键字而引发的错误问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天正好需要热更一个东西,在C#中,有一个Dictionary<string, ABC> abcDic 没有实例化。需要在lua中进行实例化 new 一下。

在官方文档里面有提到过这一块,大家可以自行看一看https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/faq.md#%E6%B3%9B%E5%9E%8B%E5%AE%9E%E4%BE%8B%E6%80%8E%E4%B9%88%E6%9E%84%E9%80%A0

其中v2.1.12版本是在2018.7.9更新的,大家注意版本号https://github.com/Tencent/xLua/blob/master/Assets/XLua/CHANGELOG.txt

 

这里之所以在博客里复述一遍是因为,我们大部分的List或者Dictionary中,value用的都是自定义的类,然后要是使用旧版本的xlua,我们这种小白可能就会碰到一个问题,没有使用Assembly-CSharp程序集关键字导致报错。当你要实例化使用自定义类的Dictionary时,如ABC,应该如下:

self.adcDic = CS.System.Activator.CreateInstance(CS.System.Type.GetType('System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[MyExamples.ABC, Assembly-CSharp]],mscorlib'))

 

### 如何在 XLua 中创建 C# 对象 在 XLua 的环境中,可以通过 Lua 脚本直接调用 C# 类并实例化对象。以下是实现这一功能的具体方式: #### 使用 `cs` 关键字 XLua 提供了一个特殊的全局变量 `cs`,用于访问 C# 命名空间中的类和方法。通过这种方式可以轻松地创建 C# 对象。 ```lua local MyClass = cs.MyNamespace.MyClass -- 获取 C# 类 local myObject = MyClass() -- 实例化 C# 对象 myObject:MyMethod() -- 调用该对象的方法 (使用冒号表示成员方法) ``` 上述代码展示了如何利用 `cs` 来获取命名空间下的某个类,并通过标准的 Lua 构造函数语法来实例化对象[^1]。 #### 静态方法与属性的调用 如果需要调用静态方法或者访问静态属性,则可以直接使用点操作符`.`来进行交互。例如: ```lua local result = cs.System.Math.Abs(-5) -- 调用 System.Math 的静态方法 Abs() print(result) -- 输出结果为 5 ``` 这里需要注意的是,当涉及到静态成员时无需传递任何额外的对象参数[^2]。 #### 注册热更新支持 为了使某些特定类型的 C# 类能够被 Lua 正常识别以及正确处理复杂场景下的互操作需求,通常还需要对其进行标记以便于框架自动生成必要的绑定逻辑。这一步骤往往涉及到了所谓的“HotFix”机制的应用实践当中去[^3]。 对于那些希望暴露给脚本层使用的类型来说,在定义阶段就应该考虑加入 `[LuaCallCSharp]` 特性声明;而对于整个程序集而言则可通过配置文件等方式指定哪些部分应该参与动态加载过程从而减少不必要的开销同时提高运行效率[^4]。 最终完整的流程如下所示: 1. 定义好目标 C# 类型; 2. 添加适当特性和设置; 3. 编写对应的 Lua 脚本来完成实际业务逻辑编写工作即可顺利达成预期效果!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值