internal Array TableToArray(Func <int, object> luaParamValueExtractor, Type paramArrayType, int startIndex, int count) { Array paramArray; if (count == 0) { return(Array.CreateInstance(paramArrayType, 0)); } var luaParamValue = luaParamValueExtractor(startIndex); #if false // LuaTable unpacking is disabled. // In Lua, print({1, 2, 3}) should pass an array, not multiple arguments. // You can write print(unpack({1, 2, 3})) if necessary. if (luaParamValue is LuaTable) { LuaTable table = (LuaTable)luaParamValue; IDictionaryEnumerator tableEnumerator = table.GetEnumerator(); tableEnumerator.Reset(); paramArray = Array.CreateInstance(paramArrayType, table.Values.Count); int paramArrayIndex = 0; while (tableEnumerator.MoveNext()) { object value = tableEnumerator.Value; if (paramArrayType == typeof(object)) { if (value != null && value.GetType() == typeof(double) && IsInteger((double)value)) { value = Convert.ToInt32((double)value); } } paramArray.SetValue(Convert.ChangeType(value, paramArrayType), paramArrayIndex); paramArrayIndex++; } } else #endif { paramArray = Array.CreateInstance(paramArrayType, count); paramArray.SetValue(luaParamValue, 0); for (int i = 1; i < count; i++) { startIndex++; var value = luaParamValueExtractor(startIndex); paramArray.SetValue(value, i); } } return(paramArray); }
internal Array TableToArray(Func <int, object> luaParamValueExtractor, Type paramArrayType, int startIndex, int count) { Array paramArray; if (count == 0) { return(Array.CreateInstance(paramArrayType, 0)); } var luaParamValue = luaParamValueExtractor(startIndex); if (luaParamValue is LuaTable) { LuaTable table = (LuaTable)luaParamValue; IDictionaryEnumerator tableEnumerator = table.GetEnumerator(); tableEnumerator.Reset(); paramArray = Array.CreateInstance(paramArrayType, table.Values.Count); int paramArrayIndex = 0; while (tableEnumerator.MoveNext()) { object value = tableEnumerator.Value; if (paramArrayType == typeof(object)) { if (value != null && value.GetType() == typeof(double) && IsInteger((double)value)) { value = Convert.ToInt32((double)value); } } #if SILVERLIGHT paramArray.SetValue(Convert.ChangeType(value, paramArrayType, System.Globalization.CultureInfo.InvariantCulture), paramArrayIndex); #else paramArray.SetValue(Convert.ChangeType(value, paramArrayType), paramArrayIndex); #endif paramArrayIndex++; } } else { paramArray = Array.CreateInstance(paramArrayType, count); paramArray.SetValue(luaParamValue, 0); for (int i = 1; i < count; i++) { startIndex++; var value = luaParamValueExtractor(startIndex); paramArray.SetValue(value, i); } } return(paramArray); }