/// <summary> /// 将lua代码片段放入函数中执行,将key/value构建为lua的单个参数传入 /// </summary> /// <param name="lua"></param> /// <param name="scriptCode"></param> /// <param name="parameters"></param> /// <returns></returns> public static object[] ExecuteLuaScript(Lua lua, string scriptCode, IEnumerable <KeyValuePair <string, object> > parameters) { if (parameters == null) { parameters = new Dictionary <string, object>(); } string json = LuaScriptRunner.ToLuaScript(parameters); json = string.IsNullOrWhiteSpace(json) ? "{}" : json; StringBuilder paramsBuilder = new StringBuilder(); IList <object> paramsValues = new List <object>(); foreach (var pair in parameters) { if (paramsBuilder.Length > 0) { paramsBuilder.Append(","); } paramsBuilder.Append(pair.Key); paramsValues.Add(pair.Value); } string script = @" function func(" + paramsBuilder + @") " + scriptCode + @" end"; return(RunLuaScript(() => { lua.DoString(script); var scriptFunc = lua["func"] as LuaFunction; var res = scriptFunc.Call(paramsValues.ToArray()); return res; })); }
/// <summary> /// 将lua代码片段放入函数中执行 /// </summary> /// <param name="lua">Lua对象</param> /// <param name="scriptCode">代码片段</param> /// <param name="parameters">参数</param> /// <returns>返回执行结果</returns> public static object[] ExecuteLuaScript(Lua lua, string scriptCode, IEnumerable <KeyValuePair <string, object> > parameters, object bodyJson) { if (parameters == null) { parameters = new Dictionary <string, object>(); } string paramsData = LuaScriptRunner.ToLuaScript(parameters); string bodyJsonLuaScript = LuaScriptRunner.ToLuaScript(bodyJson); bodyJsonLuaScript = string.IsNullOrWhiteSpace(bodyJsonLuaScript) ? "{}" : bodyJsonLuaScript; lua.DoString("params=" + paramsData); lua.DoString("bodyJson=" + bodyJsonLuaScript); LuaTable paramsTable = lua.GetTable("params"); LuaTable bodyJsonTable = lua.GetTable("bodyJson"); string script = @" function func(params,bodyJson) " + scriptCode + @" end"; return(RunLuaScript(() => { lua.DoString(script); var scriptFunc = lua["func"] as LuaFunction; var res = scriptFunc.Call(paramsTable, bodyJsonTable); return res; })); }
/// <summary> /// Table数组转为List /// </summary> /// <param name="table">Table数组</param> /// <returns></returns> private static IList <object> LuaTableToList(LuaTable table) { IList <object> result = new List <object>(); foreach (var key in table.Keys) { var value = table[key]; var kind = LuaScriptRunner.CheckLuaTable(value); if (kind == 0) { result.Add(value); } else if (kind == 1) { IEnumerable <KeyValuePair <string, object> > res = LuaScriptRunner.LuaTableToDictionary((LuaTable)value); result.Add(res); } else { IList <object> res = LuaScriptRunner.LuaTableToList((LuaTable)value); result.Add(res); } } return(result); }
/// <summary> /// lua数据转C#数据 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static T LuaTableToCSharpData <T>(object obj) { object result = null; if (obj != null) { int kind = LuaScriptRunner.CheckLuaTable(obj); if (kind == 3) { return(default(T)); } if (kind == 0) { result = obj; } else if (kind == 1) { result = LuaScriptRunner.LuaTableToDictionary((LuaTable)obj); } else { result = LuaScriptRunner.LuaTableToList((LuaTable)obj); } } return((T)result); }