using System; using System.Collections; using NLua.Extensions; using NLua.Native; namespace NLua { public class LuaTable : LuaBase { public LuaTable(int reference, Lua interpreter): base(reference, interpreter) { } /// /// Indexer for string fields of the table /// public object this[string field] { get => !TryGet(out var lua) ? null : lua.GetObject(_Reference, field); set { if (!TryGet(out var lua)) { return; } lua.SetObject(_Reference, field, value); } } /// /// Indexer for numeric fields of the table /// public object this[object field] { get => !TryGet(out var lua) ? null : lua.GetObject(_Reference, field); set { if (!TryGet(out var lua)) { return; } lua.SetObject(_Reference, field, value); } } public IDictionaryEnumerator GetEnumerator() { if (!TryGet(out var lua)) { return null; } return lua.GetTableDict(this).GetEnumerator(); } public ICollection Keys => !TryGet(out var lua) ? null : lua.GetTableDict(this).Keys; public ICollection Values { get { if (!TryGet(out var lua)) { return Array.Empty(); } return lua.GetTableDict(this).Values; } } /// /// Gets an string fields of a table ignoring its metatable, /// if it exists /// internal object RawGet(string field) => !TryGet(out var lua) ? null : lua.RawGetObject(_Reference, field); /// /// Pushes this table into the Lua stack /// internal void Push(LuaState luaState) => luaState.GetRef(_Reference); public override string ToString() => "table"; } }