0

質問: C# オブジェクト (できれば匿名型) を使用して、C# から 'LuaInterface' スクリプト スコープにテーブルを挿入するにはどうすればよいですか?

/// I want to do this, but it does not work 
/// (complains that 'test' is userdata and not table 
/// when I pass it to pairs() in the script)
//lua["test"] = new { A = 1, B = 2 };

/// another option
/// but building this string is a PITA (actual string is nested and long).
lua.DoString("test = { A = 1, B = 2 }");

// So I have to do this
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");
4

2 に答える 2

0

匿名型を lua テーブルにシリアル化したい場合は、ユーザー リフレクションが必要になると思います。たぶん、lua テーブル シリアライザーを作成してみることができます。テーブルを文字列として組み立て、それを DoString で Lua に渡そうとすると思います

辞書ソリューションは優れていると思います。リフレクションなしでネストされたテーブルを使用できます。タプルを試してみましたが、十分に汎用的ではなく、最終的にリフレクションのアイデアに戻りました。

拡張メソッドを作成します。

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-22T17:25:06.923 に答える
0

Dictionaryテーブル内に配置するキーと値をC# に入力できます。次に、「I have to...」セクションで行っていることを行いますが、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-16T04:31:03.593 に答える