LuaInterface:将一个表添加到脚本作用域中。

问题: 如何使用 C# 对象 (最好是匿名类型) 将表格插入到“LuaInterface”脚本范围中?

/// 我想这样做,但它不起作用
/// (当我将它传递给脚本中的 pairs() 函数时,
/// 它抱怨 'test' 是userdata而不是table)
//lua["test"] = new { A = 1, B = 2 };

/// 另一种选项
/// 但构建这个字符串很难(实际字符串是嵌套和长的)。
lua.DoString("test = { A = 1, B = 2 }");

// 所以我不得不这样做
lua.NewTable("test");
((LuaTable) lua["test"])["A"] = 1;
((LuaTable) lua["test"])["B"] = 2;

lua.DoString("for k,v in pairs(test) do print(k..': '..v) end");

原文链接 https://stackoverflow.com/questions/3024190

点赞
stackoverflow用户161424
stackoverflow用户161424

你可以用 C# 的 Dictionary 填充要放入表格中的键和值。然后在“我必须...”的部分之内使用 foreach 循环执行所需操作。

未经测试的代码:

var test = new Dictionary<string, int> {
    { "A", 1 },
    { "B", 2 }
};

foreach (var entry in test)
{
    ((LuaTable) lua)["test"])[entry.Key] = entry.Value;
}

我将这个基本想法重构成一个通用的类,以增加灵活性。

2010-06-16 04:31:03
stackoverflow用户621390
stackoverflow用户621390

我认为如果您想将匿名类型序列化为 Lua 表,您将需要使用反射。也许您可以尝试编写一个 Lua 表序列化器。我认为我会尝试将我的表组装为字符串并将其传递给 Lua 使用 DoString。

我认为字典解决方案很好,您可以使用嵌套表而无需使用反射。我曾经尝试过元组,但它们不够通用,最终我回到了反射的想法。

我会创建一个扩展方法:

public static class LuaExt
{
    public static LuaTable GetTable(this Lua lua, string tableName)
    {
        return lua[tableName] as LuaTable;
    }

    public static LuaTable CreateTable(this Lua lua, string tableName)
    {
        lua.NewTable(tableName);
        return lua.GetTable(tableName);
    }

    public static LuaTable CreateTable(this Lua lua)
    {
        lua.NewTable("my");
        return lua.GetTable("my");
    }
}

然后我可以像这样写:

var lua = new Lua();
var table = lua.CreateTable("test");

table["A"] = 1;
table["B"] = 1;

table["C"] = lua.CreateTable();
((LuaTable) table["C"])["A"] = 3;

table["D"] = lua.CreateTable();
((LuaTable)table["D"])["A"] = 3;

foreach (var v in table.Keys)
{
    Console.WriteLine(v + ":" + table[v]);
}
2011-02-22 17:25:06