/// <summary> /// Execute this function with the specified number of parameters. /// </summary> public object Execute(params object[] pars) { if (mi == null) { return(null); } var parameters = this.parameters; if (pars == null && mParamCount != 0) { pars = new object[parameters.Length]; } if (mParamCount == 1 && parameters[0].ParameterType == typeof(object[])) { pars = new object[] { pars } } ; try { if (mAutoCast) { for (int i = 0; i < mParamCount; ++i) { var passed = pars[i].GetType(); if (mTypes[i] != passed) { pars[i] = Serialization.CastValue(pars[i], mTypes[i]); } } } return(mi.Invoke(obj, pars)); } catch (Exception ex) { if (ex.GetType() == typeof(NullReferenceException)) { return(null); } var tryAgain = false; if (mParamCount == pars.Length) { if (mTypes == null) { mTypes = new Type[mParamCount]; for (int i = 0; i < mParamCount; ++i) { mTypes[i] = parameters[i].ParameterType; } } for (int i = 0; i < mParamCount; ++i) { var passed = (pars[i] != null) ? pars[i].GetType() : mTypes[i]; if (mTypes[i] != passed) { pars[i] = Serialization.CastValue(pars[i], mTypes[i]); if (pars[i] != null) { tryAgain = true; } } } } if (tryAgain) { try { if (parameters.Length == 1 && parameters[0].ParameterType == typeof(object[])) { pars = new object[] { pars } } ; var retVal = mi.Invoke(obj, pars); mAutoCast = true; return(retVal); } catch (Exception ex2) { ex = ex2; } } UnityTools.PrintException(ex, this, 0, mi.Name, pars); return(null); } } }