/// <summary> /// Automatically invokes the method based on its type (instance/ static) /// </summary> /// <param name="method">Method to be invoked</param> /// <param name="objects">Target objects</param> /// <param name="predicate">Predicate for filtering objects</param> /// <param name="parameters">Parameters of the method</param> /// <returns>The string describing result of the execution or error message (discardable)</returns> public static string AutoInvoke(this MethodBase method, UnityEngine.Object[] objects, Func <UnityEngine.Object, bool> predicate, object[] parameters) { ParameterInfo[] parameterInfos = method.GetParameters(); int parametersLength = parameters == null ? 0 : parameters.Length; int fixedParametersLength = parameterInfos == null ? 0 : parameterInfos.Length; object[] fixedParameters = fixedParametersLength == 0 ? null : new object[fixedParametersLength]; for (int i = 0; i < fixedParametersLength; i++) { fixedParameters[i] = i < parametersLength ? parameters[i] : parameterInfos[i].DefaultValue; } if (method.IsStatic) { return(method.AutoInvokeStatic(fixedParameters)); } List <UnityEngine.Object> objectList = objects.Where(predicate).ToList(); if (objectList.Count == 0) { return(StringConstantInternal.objectNotFoundWarning.Color(Color.yellow)); } string s = ""; objectList.ForEach(obj => s = s + method.AutoInvokeInstance(obj, fixedParameters) + "\n"); return(s.Substring(0, s.Length - 1)); }